我需要找一些具有特定颜色的文档。我搜索了这个地方,并能够构建以下查询:
db.tasks.find({$or: { color: {$all: ['e4oqPeoBTJtCpG53K', 'cvmQv7vQHunPnmqPz'] }}});
我在这里尝试的是找到所有颜色为e4o...
和cvmQ..
的文档
但这根本不起作用。有什么建议我做错了吗?
答案 0 :(得分:3)
如果您只是想找到仅包含指定颜色值的文档,您可以将此表单与$and
运算符一起使用并使用$size
:< / p>
db.tasks.find({ "$and": [
{ "color": "e4oqPeoBTJtCpG53K" },
{ "color": "cvmQv7vQHunPnmqP"' },
{ "color": { "$size": 2 } }
]}
这通过实际修复$all
作为运算符的正确使用来简化MongoDB 2.6及更高版本,使其行为与逻辑$and
非常相似,但语法更好:
db.tasks.find({ "$and": [
{"color": {
"$all": [ "e4oqPeoBTJtCpG53K", "cvmQv7vQHunPnmqPz" ]
},
{ "color": { "$size": 2 } }
]}
甚至另一种编写相同内容的方式就是使用逻辑$or
:
db.tasks.find({ "$and": [
"$or": [
{"color": [ "e4oqPeoBTJtCpG53K", "cvmQv7vQHunPnmqPz" ] },
{"color": [ "cvmQv7vQHunPnmqPz", "e4oqPeoBTJtCpG53K" ] }
],
{ "color": { "$size": 2 } }
]}
如果数组必须包含这两个元素且可能更多,那么简单形式仅包含$and
约束:
db.tasks.find({ "$and": [
{ "color": "e4oqPeoBTJtCpG53K" },
{ "color": "cvmQv7vQHunPnmqP"' }
]}
如果任何文档中的“any”元素,这是使用$or
运算符指定的逻辑$in
db.tasks.find({
"color": {
"$in": ["e4oqPeoBTJtCpG53K", "cvmQv7vQHunPnmqPz"]
}
})
无论你真正想做什么,都应该有足够的选择。
请注意,这些将与“服务器端”实施一起使用,但“客户端”使用“minimongo”的里程可能会因客户端代码的支持而有所不同。
答案 1 :(得分:1)
尝试不使用$or
,并使用$in
(如果您正在查找列出颜色的文档),(如果您想要列出所有颜色的文档,则为$ all) )。
db.tasks.find({ color: {$in: ['e4oqPeoBTJtCpG53K', 'cvmQv7vQHunPnmqPz'] }});