无法在MongoDB中进行简单查询(AND OR NOT)

时间:2013-03-27 17:23:11

标签: mongodb nosql

给出类似的集合:

> db.test.find({}, {_id:0})
{ "name" : "star wars I", "duration" : 120 }
{ "name" : "star wars II", "duration" : 125 }
{ "name" : "star wars III", "duration" : 135 }
{ "name" : "star wars IV", "duration" : 115 }
{ "name" : "star trek I", "duration" : 135 }
{ "name" : "star trek II", "duration" : 200 }
{ "name" : "alien", "duration" : 200 }

如何创建与此SQL语句等效的查询?

SELECT * FROM test
WHERE (name LIKE '%star%' AND NOT name LIKE '%wars%') OR duration = 200

即使查询更简单,我也无法获得预期的结果,例如:

这可以按预期工作:

> db.test.find({ name: /star/i, name: /trek/i }, {_id:0})  
{ "name" : "star trek I", "duration" : 135 }  
{ "name" : "star trek II", "duration" : 200 }

但是这个没有结果。为什么呢?

> db.test.find({ name: /star/i, $not: {name: /trek/i} }, {_id:0})

3 个答案:

答案 0 :(得分:1)

此时您必须使用$ne运算符,因为$not用于否定其他运算符。

编辑:正如Peter在评论中所述,$ ne在这里不起作用(因为正则表达式是一个运算符)。只是您的查询顺序错误。

> db.test.find({ name: /star/i, name: { $not: /trek/i } }, {_id:0})

给定SQL的查询应如下所示:

> db.test.find({$or:
    [
      { name: /star/i, name: { $not: /trek/i } },
      { duration: 200 }
    ]
  },{_id:0})

答案 1 :(得分:1)

试试这个:
db.test.find({name: {$regex: /star/i , $not: /trek/i }}, {_id:0});

答案 2 :(得分:0)

您可能想要更改查询,因为“star”一词对“星球大战”和“星际迷航”记录都很常见。

这是一个希望它有帮助的建议

db.test.find({name:{$regex:/wars/,$nin:["trek"] }},{_id:0})
{ "name" : "star wars I", "duration" : 120 }
{ "name" : "star wars II", "duration" : 125 }
{ "name" : "star wars III", "duration" : 135 } 
{ "name" : "star wars IV", "duration" : 115 }