查找具有多个匹配子文档的文档

时间:2016-03-31 12:40:28

标签: mongodb mongodb-query

我在查询子计数器时有点迷失。

考虑以下事项:

{id: "I1", value: "V1"} and {id: "I2", value: "V2"}.

我想查询集合并获取包含名称为" gadget1"的小工具的所有内容。并且在components数组中包含一个名为" component1"的文档," component1" -subdocumnent也应该包含 在properties数组中的两个文件:

{ "$and": [{"gadgets.name": "gadget1"}{"gadgets.properties.id": "I1", "gadgets.properties.value": "V1"},{"gadgets.properties.id": "I2", "gadgets.properties.value": "V2"}]}

这可以通过查询吗?

我尝试过以下查询:

Select DATE_FORMAT(timecol,"%h:%i") AS time FROM chatLogTwo

但没有成功。

1 个答案:

答案 0 :(得分:1)

所以这里有几件事。这实际上是$and的情况,并且通常不需要它,但是当您在同一对象路径上需要多个条件时需要它。并且还要匹配数组子文档上的多个属性,您需要$elemMatch

db.collection.find({
  "$and": [
    {
      "components.properties": {
        "$elemMatch": {
            "id": "I1", "value": "V1"
        }
      }        
    },
    {
      "components.properties": {
        "$elemMatch": {
            "id": "I2", "value": "V2"
        }
      }        
    }
  ]
})

这将告诉您文档在"components.properties"中的“两个”数组元素实际上与两组条件匹配。

考虑到这一点,您实际上可以在此使用$all,与$elemMatch结合使用:

db.collection.find({
    "components.properties": {
        "$all": [
            { "$elemMatch": {
                "id": "I1", "value": "V1"
            }},
            { "$elemMatch": {
                "id": "I2", "value": "V2"
            }}
        ]
    }
})

这是一种更清晰易读的格式。 $all基本上是$and的另一种形式,您可以使用它来指定适用于此特定格式的相同键的条件。