Meteor / MongoDB:通过多个相同属性的值查找文档

时间:2014-04-07 15:13:33

标签: javascript mongodb meteor mongodb-query

我需要找一些具有特定颜色的文档。我搜索了这个地方,并能够构建以下查询:

db.tasks.find({$or: { color:  {$all: ['e4oqPeoBTJtCpG53K', 'cvmQv7vQHunPnmqPz'] }}});

我在这里尝试的是找到所有颜色为e4o...cvmQ..的文档 但这根本不起作用。有什么建议我做错了吗?

2 个答案:

答案 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'] }});