$ all运算符如何与mongoDB中的$ elemMatch一起使用?

时间:2017-11-21 06:48:40

标签: mongodb operators

请提供此mongoDB查询的说明。

db.inventory.find({ qty : { $all : [ { $elemMatch : { size: "M", num : { $gt : 40},color : "green" }} ,{ $elemMatch : { num :100 , color : "green"}}  ]}}).pretty()

1 个答案:

答案 0 :(得分:3)

好的,假设我们有以下文件:

/* 1 */
{
    "_id" : ObjectId("5a148f114d8a2fe38bec772a"),
    "samplearray" : [ 
        {
            "size" : "M",
            "num" : 45,
            "color" : "black"
        }, 
        {
            "size" : "L",
            "num" : 75,
            "color" : "blue"
        }
    ]
}

此处samplearray有两个条目

1

此查询:

db.sample.find({ samplearray: { $elemMatch: { num: { $gt: 41 }}}})

会退回文件。在查询中,我们要求输入num大于41的数组值。

2

现在,如果我们执行此查询:

db.sample.find({ samplearray: { $elemMatch: { num: { $gte: 50 }, color: "black"}}})

它不应该返回任何东西。因为$elemMatch查看每个单独的数组值条目。现在文件不符合。因为在单个数组中,我们没有满足两个条件的数组值条目。在文档中,我们有一个满足num: { $gte: 50 }的数组条目(例如:

{
  "size" : "L",
  "num" : 75,
  "color" : "blue"
}

color: "black"一个(例如:

{
   "size" : "M",
   "num" : 45,
   "color" : "black"
}

) ,但不是两者兼而有之。

3

如果我们想要将文档作为结果,那么我们将不得不重写我们的查询,这是我们介绍$all的地方:

db.sample.find({
    samplearray: {
        $all: [{
                $elemMatch: {
                    num: {
                        $gte: 50
                    }
                }
            },
            {
                $elemMatch: {
                    color: "black"
                }
            }
        ]
    }
})

您现在明白了$all$elemMatch了吗?