通过在 golang 中检查 MongoDB 中的多个属性值来检索项目列表
Retrieve item list by checking multiple attribute values in MongoDB in golang
这个问题基于 MongoDB,如何通过 select 多个 condition.It 来检索 selected 项目,就像 Mysql 中的 IN 条件
SELECT * FROM venuelist WHERE venueid IN (venueid1, venueid2)
我附上了我使用过的 json 数据结构。[参考:JSON MONGODB 的结构].
例如,它有一个 venueList 然后在场地列表中,它有几个属性 venue id 和用户代理名称和总计数的总和 value.user 代理意味着用户 Os,browser和设备信息。在这种情况下,我使用了 os distribution.In 那种情况下我被计数 linux,ubuntu 计数特定的 venueid。
就是这样,
"sum" : [
{
"name" : "linux",
"value" : 12
},
{
"name" : "ubuntu",
"value" : 4
}
],
最后,我想通过在 MongoDB.
中的一个查找查询中 selecting venueid 列表来获取所有 linux 用户数
例如,我想通过条件 if venue id VID1212[=39= select linux 用户的所有计数] 或 VID4343
参考:JSON MONGODB
的结构
{
"_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 操作数据
expected out put is :
output
- linux : 12+2 = 14
- ubuntu : 4+0 = 4
Don't consider inner list in venuelist.
您需要使用聚合框架,您将 运行 聚合管道首先根据以下条件过滤集合中的文档
使用 $match
运算符的 venueList
id。
第二条管道需要展平 venueList
和 sum
子文档数组,以便将文档中的数据作为非规范化条目在管道中进一步处理。 $unwind
运算符在这里很有用。
展开后需要使用 $match
进一步过滤,这样只有您要聚合的文档才允许进入下一个管道。
主要管道将是 $group
operator stage which aggregates the filtered documents to create the desired sums using the accumulator operator $sum
. For the desired result, you would need to use a tenary operator like $cond
to create the independent count fields since that will feed the number of documents to the $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"
}
}
}
}
])
这个问题基于 MongoDB,如何通过 select 多个 condition.It 来检索 selected 项目,就像 Mysql 中的 IN 条件
SELECT * FROM venuelist WHERE venueid IN (venueid1, venueid2)
我附上了我使用过的 json 数据结构。[参考:JSON MONGODB 的结构].
例如,它有一个 venueList 然后在场地列表中,它有几个属性 venue id 和用户代理名称和总计数的总和 value.user 代理意味着用户 Os,browser和设备信息。在这种情况下,我使用了 os distribution.In 那种情况下我被计数 linux,ubuntu 计数特定的 venueid。
就是这样,
"sum" : [
{
"name" : "linux",
"value" : 12
},
{
"name" : "ubuntu",
"value" : 4
}
],
最后,我想通过在 MongoDB.
中的一个查找查询中 selecting venueid 列表来获取所有 linux 用户数例如,我想通过条件 if venue id VID1212[=39= select linux 用户的所有计数] 或 VID4343
参考:JSON MONGODB
的结构{
"_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 操作数据
expected out put is :
output
- linux : 12+2 = 14
- ubuntu : 4+0 = 4
Don't consider inner list in venuelist.
您需要使用聚合框架,您将 运行 聚合管道首先根据以下条件过滤集合中的文档
使用 $match
运算符的 venueList
id。
第二条管道需要展平 venueList
和 sum
子文档数组,以便将文档中的数据作为非规范化条目在管道中进一步处理。 $unwind
运算符在这里很有用。
展开后需要使用 $match
进一步过滤,这样只有您要聚合的文档才允许进入下一个管道。
主要管道将是 $group
operator stage which aggregates the filtered documents to create the desired sums using the accumulator operator $sum
. For the desired result, you would need to use a tenary operator like $cond
to create the independent count fields since that will feed the number of documents to the $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"
}
}
}
}
])