这个问题基于MongoDB,如何通过选择多个condition.It来检索所选的项目,就像Mysql中的IN条件一样。
从静脉列表中选择* (venueid1,venueid2)
我已经附加了我使用过的json数据结构。参考: MONGODB 的JSON。
作为一个例子,它有一个venueList然后在场地列表中,它有多个属性地点id和用户代理名称之和以及总数量,因为value.user代理意味着用户Os、浏览器和设备信息。在本例中,我使用os distribution.In --在这个例子中,我是count,ubuntu --依赖于特定的venueid。
就像这样,
"sum" : [
{
"name" : "linux",
"value" : 12
},
{
"name" : "ubuntu",
"value" : 4
}
],
最后,我希望通过在MongoDB中的一个查找查询中选择venueid列表来获得所有linux用户计数。
例如,我希望通过对场地id为id VID1212还是VID4343进行调整来选择linux用户的所有计数。
参考文献: MONGODB的JSON结构
{
"_id" : ObjectId("57f940c4932a00aba387b0b0"),
"tenantID" : 1,
"date" : "2016-10-09 00:23:56",
"venueList" : [
{
"id" : “VID1212”,
"sum" : [
{
"name" : "linux",
"value" : 12
},
{
"name" : "ubuntu",
"value" : 4
}
],
“ssidList” : [ // this is list of ssid’s in venue
{
"id" : “SSID1212”,
"sum" : [
{
"name" : "linux",
"value" : 8
},
{
"name" : "ubuntu",
"value" : 6
}
],
“macList” : [ // this is mac list inside particular ssid ex: this is mac list inside the SSID1212
{
"id" : “12:12:12:12:12:12”,
"sum" : [
{
"name" : "linux",
"value" : 12
},
{
"name" : "ubuntu",
"value" : 1
}
]
}
]
}
]
},
{
"id" : “VID4343”,
"sum" : [
{
"name" : "linux",
"value" : 2
}
],
"ssidList" : [
{
"id" : “SSID4343”,
"sum" : [
{
"name" : "linux",
"value" : 2
}
],
"macList" : [
{
"id" : “43:43:43:43:43:34”,
"sum" : [
{
"name" : "linux",
"value" : 2
}
]
}
]
}
]
}
]
}
我使用golang作为语言,使用mgo.v2包使用mongoldb处理数据。
预期产出如下: 输出
不要考虑内部清单在静脉列表。
发布于 2016-10-09 14:52:23
您需要使用聚合框架,其中将运行一个聚合管道,该管道首先使用venueList
操作符根据$match‘d过滤集合中的文档。
第二个管道需要扁平venueList
和sum
子文档数组,以便将文档中的数据进一步作为去马尔化条目处理。$unwind运算符在这里很有用。
在展开之后,还需要使用$match进行进一步的筛选,以便只允许要聚合的文档进入下一个管道。
主要管道是$group操作符阶段,它聚合过滤后的文档,使用累加器运算符$sum创建所需的和。对于所需的结果,您需要使用像$cond这样的10进制运算符来创建独立的计数字段,因为这将根据名称值将文档数输入到$sum表达式。
综上所述,请考虑运行以下管道:
db.collection.aggregate([
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList" },
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList.sum" },
{
"$group": {
"_id": null,
"linux": {
"$sum": {
"$cond": [
{ "$eq": [ "$venueList.sum.name", "linux" ] },
"$venueList.sum.value", 0
]
}
},
"ubuntu": {
"$sum": {
"$cond": [
{ "$eq": [ "$venueList.sum.name", "ubuntu" ] },
"$venueList.sum.value", 0
]
}
}
}
}
])
要在mGo中使用,可以使用http://godoc.org/labix.org/v2/mgo#Collection.Pipe中的指导来转换上面的管道
为了获得更灵活和性能更好的替代方案,它的执行速度要比上面的要快得多,并且还要考虑到和列表的未知值,请按以下方式运行替代管道
db.collection.aggregate([
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList" },
{ "$match": { "venueList.id": { "$in": ["VID1212", "VID4343"] } } },
{ "$unwind": "$venueList.sum" },
{
"$group": {
"_id": "$venueList.sum.name",
"count": { "$sum": "$venueList.sum.value" }
}
},
{
"$group": {
"_id": null,
"counts": {
"$push": {
"name": "$_id",
"count": "$count"
}
}
}
}
])
https://stackoverflow.com/questions/39943111
复制相似问题