在mongodb的聚合和组函数中添加where条件
我有一个mongo模型,比如说包含以下数据的MYLIST:-在mongodb的聚合和组函数中添加where条件,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个mongo模型,比如说包含以下数据的MYLIST:- { "_id" : ObjectId("542139f31284ad1461dbc15f"), "Category" : "CENTER", "Name" : "STAND", "Url" : "center/stand", "Img" : [ { "url" : "www.google.com/images", "main" : "1",
{
"_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
数组中为每个条目的相同类别获得多个条目
我真正需要的是只获取那些对home
key有一定价值的图像。
预期结果:-
[
{ _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相对较新。仍然不确定这是否是您想要的,甚至不知道为什么要在这个分组中使用。但是,如果您只想“过滤”结果中返回的数组内容,那么您想做的是在处理管道后将数组元素调整到您的条件,以便“反规范化”内容:
db.MYLIST.aggregate([
//如果您只需要那些匹配的数组成员,那么匹配
//首先包含它们的文档
{“$match”:{“Img.home”:1},
//展开以取消规范化或“取消加入”文档
{“$unwind”:“$Img”},
//再次匹配以“过滤”不匹配的元素
{“$match”:{“Img.home”:1},
//然后进行分组
{“$group”:{
“_id”:“$Category”,
“姓名”:{
“$addToSet”:{
“名称”:“$name”,
“url”:“$url”,
“img”:“$img”
}
}
}},
//最后分类
{“$sort”:{“\u id”:1}
]);
因此,$match
管道相当于一般查询或SQL术语中的“where子句”,可以在任何阶段使用。当有某种类型的过滤结果时,通常最好将此作为第一阶段。它通过减少要处理的文档来减少总体负载,即使最终结果的“全部”没有像处理数组那样被删除
$unwind
阶段允许像处理其他文档一样处理数组元素。当然,您可以在此之后使用另一个$match
管道阶段,以便将文档与您的查询条件进行匹配。您想在这里实现什么?您是否真的试图按类别对唯一的项目进行分组?或者您只是试图只获取数组中与“home”=1
匹配的项?也许展示一些你所期待的。我想要独特的类别。然后在类别本身中,我想找到它们的url和图像的唯一名称。像这样的结构:-[{u id:'BRAKE',name:[[Object],[Object],]},{u id:'CENTER',name:[[Object],[Object],]},]你并没有真正解释“home”=1
与此有什么关系。你真的想过滤这个吗?或者你只是想解释你是通过“url”或者其他什么来wan“唯一的”项目。您可以编辑问题并添加详细信息。[Object][Object]并不是一个很好的解释。您可以更好地格式化它,并且您似乎正在显示您的“当前”结果。我在问你“期望”看到什么。我想现在你能够理解我想要什么了,因为我想要类别和名称的独特组合。谢谢,我找到了答案。