请提供此mongoDB查询的说明。
db.inventory.find({ qty : { $all : [ { $elemMatch : { size: "M", num : { $gt : 40},color : "green" }} ,{ $elemMatch : { num :100 , color : "green"}} ]}}).pretty()
答案 0 :(得分:3)
好的,假设我们有以下文件:
/* 1 */
{
"_id" : ObjectId("5a148f114d8a2fe38bec772a"),
"samplearray" : [
{
"size" : "M",
"num" : 45,
"color" : "black"
},
{
"size" : "L",
"num" : 75,
"color" : "blue"
}
]
}
此处samplearray
有两个条目
此查询:
db.sample.find({ samplearray: { $elemMatch: { num: { $gt: 41 }}}})
会退回文件。在查询中,我们要求输入num
大于41的数组值。
现在,如果我们执行此查询:
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"
}
) ,但不是两者兼而有之。
如果我们想要将文档作为结果,那么我们将不得不重写我们的查询,这是我们介绍$all
的地方:
db.sample.find({
samplearray: {
$all: [{
$elemMatch: {
num: {
$gte: 50
}
}
},
{
$elemMatch: {
color: "black"
}
}
]
}
})
您现在明白了$all
和$elemMatch
了吗?