我有mongo模型让我们说 MYLIST 包含如下数据: -
{
"_id" : ObjectId("542139f31284ad1461dbc15f"),
"Category" : "CENTER",
"Name" : "STAND",
"Url" : "center/stand",
"Img" : [ {
"url" : "www.google.com/images",
"main" : "1",
"home" : "1",
"id" : "34faf230-43cf-11e4-8743-311ea2261289"
},
{
"url" : "www.google.com/images1",
"main" : "1",
"home" : "0",
"id" : "34faf230-43cf-11e4-8743-311e66441289"
} ]
}
我对 MYLIST 集合执行以下查询:
db.MYLIST.aggregate([
{ "$group": {
"_id": "$Category",
"Name": { "$addToSet": {
"name": "$Name",
"url": "$Url",
"img": "$Img"
}}
}},
{ "$sort": { "_id" : 1 } }
]);
我得到了以下结果 -
[
{ _id: 'CENTER',
Name:
[ { "name" : "Stand",
"url" : "center/stand",
"img": { "url" : "www.google.com/images" , "main" : "1", "home" : "1", "id" : "350356a0-43cf-11e4-8743-311ea2261289" }
}]
},
{ _id: 'CENTER',
Name:
[ { "name" : "Stand",
"url" : "center/stand",
"img": { "url" : "www.google.com/images1" , "main" : "1", "home" : "0", "id" : "34faf230-43cf-11e4-8743-311ea2261289" }
}]
}
]
正如您所看到的,img
密钥本身是对象数组,因此我在img
数组中为每个条目的相同类别获取多个条目。< / p>
我真正需要的是只获取那些具有home
键值的图像。
预期结果: -
[
{ _id: 'CENTER',
Name:
[ { "name" : "Stand",
"url" : "center/stand",
"img": { "url" : "www.google.com/images" , "main" : "1", "home" : "1", "id" : "350356a0-43cf-11e4-8743-311ea2261289" }
}]
},
]
因此,我想在上述查询中添加img.home > 0
的条件,有人可以帮我解决这个问题,因为我是MongoDB的新手。
答案 0 :(得分:1)
仍然不确定这是否是您想要的,或者甚至为什么要在此分组上使用$addToSet
。但是,如果您只想“过滤”结果中返回的数组内容,那么在处理$match
管道后,您要做的是$unwind
数组元素“去标准化”内容:
db.MYLIST.aggregate([
// If you only want those matching array members it makes sense to match the
// documents that contain them first
{ "$match": { "Img.home": 1 } },
// Unwind to de-normalize or "un-join" the documents
{ "$unwind": "$Img" },
// Match again to "filter" out those elements that do not match
{ "$match": { "Img.home": 1 } },
// Then do your grouping
{ "$group": {
"_id": "$Category",
"Name": {
"$addToSet": {
"name": "$Name",
"url": "$Url",
"img": "$Img"
}
}
}},
// Finally sort
{ "$sort": { "_id" : 1 } }
]);
因此$match
管道在SQL术语中等同于一般查询或“where子句”,并且可以在任何阶段使用。当由此产生某种类型的过滤时,通常最好将其作为第一阶段。它通过减少要处理的文档来减少总体负载,即使没有删除“全部”最终结果,就像使用数组一样。
$unwind
阶段允许像处理另一个文档一样处理数组元素。当然,您可以在此之后使用另一个$match
管道阶段,以便将文档与查询条件匹配。