【问题标题】:Meteor/MongoDB: find documents by multiple values of same propertyMeteor/MongoDB:通过相同属性的多个值查找文档
【发布时间】:2014-04-07 15:13:33
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么它根本不起作用?您没有收到任何记录吗?记录很多?收到错误?你是在客户端还是服务器上运行它?

标签: javascript mongodb meteor mongodb-query


【解决方案1】:

如果您只想找到包含指定颜色值的文档,您可以将此表单与$and 运算符一起使用并使用$size

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"' }
]}

如果任何文档中的“任何”元素,这是一个逻辑 $or,最好使用 $in 运算符指定

db.tasks.find({
    "color":  {
        "$in": ["e4oqPeoBTJtCpG53K", "cvmQv7vQHunPnmqPz"] 
    }
})

无论你真正想做什么,那里应该有足够的选择。

还请注意,这些将与“服务器端”实现一起使用,但由于客户端代码的支持,使用“minimongo”的“客户端”端的里程可能会有所不同。

【讨论】:

    【解决方案2】:

    尝试不使用$or,而使用$in(如果您正在查找具有列出颜色的文档),(如果您想要列出所有颜色的文档,则为$all)。

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

    【讨论】:

    • $all 的当前用法实际上已被弃用,并且与 2.6 及更高版本具有不同的操作。在这里使用 $in 可能是正确的情况,但我真的不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多