0

给定一个像这样的集合:

> 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})
4

3 回答 3

1

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

编辑:正如彼得在评论中所述,$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})
于 2013-03-27T18:16:41.200 回答
1

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

于 2013-03-27T18:29:47.913 回答
0

您可能希望更改查询,因为“star”一词在“star war”和“star trek”记录中都很常见。

这是一个建议希望对你有帮助

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 }
于 2013-03-27T20:03:52.567 回答