给出类似的集合:
> 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})
答案 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 }