2012-04-29 81 views
3

我正在使用MongoDB存储咖啡信息,并且遇到查询问题。混合MongoDB查询类型(和,或)

我的文档结构是:

{ _id: "Thailand Bok", tags: ["Strong", "Smooth", "Dark"] } 

我想创建查询,让我搜索无论是在名称或标记。

因此,如果查询字符串可能是“泰国Bok”或“强”,“平滑”],我想搜索包含_id或每个标签的请求。

如果我是在SQL来思考它可能是这样的:

"WHERE `_id` like 'Not present%' OR ("Strong" IN `tags` AND "Smooth" IN `tags`)" 

查询我至今是:

{ 
    $or: [ 
     { _id: { $regex: '^Not present', '$options': 'i' } }, 
     { 
      $and: [ 
       { tags: 'Strong' }, 
       { tags: 'Smooth' } 
      ] 
     } 
    ] 
} 

编辑:更正查询错误和澄清如果_id匹配或标签匹配,它应该工作

+0

这是怎么回事?你需要''和''周围的'''吗? – mindandmedia 2012-04-29 13:06:38

回答

7

$并且仅在版本中支持MongoDB 2.0+我正在使用1.8.2

5

您的查询似乎没有问题,只是使用花括号而不是$或方括号。

{$or: [ 
    {_id: {$regex: '^hailand', $options: 'i'} }, 
    {'$and': [ 
     {tags: 'Strong'}, 
     {tags: 'Smooth'} 
    ]} 
]} 

工作得很好。

+0

对不起,这是一个复制错误。我已经尝试了您的查询,并强调了我的问题。当我直接复制你的^ hailand时,我不会收到任何搜索结果。但是,如果我使用^泰国,我确实得到搜索结果。 我想要得到的结果是,您可以匹配名称或标签。 – 2012-04-29 13:36:14

+0

这很奇怪,因为当我运行这个查询 - 我得到结果: --- > db.items.find({$或:[{_id:{$ regex:'^ hailand',$ options:'i '}},{'$ and':[{tags:'Strong'},{tags:'Smooth'}]}]}) --- {“_id”:“Thailand Bok”,“tags”: [“强”,“平滑”,“黑暗”]} – daeq 2012-04-29 13:41:40

+0

......啊,答案是我是白痴:) $并且只在2.0+有效我正在使用1.8.2。抱歉。 – 2012-04-29 13:45:56