gpt4 book ai didi

json - 通过在golang中检查MongoDB中的多个属性值来检索项目列表

转载 作者:IT老高 更新时间:2023-10-28 12:31:26 28 4
gpt4 key购买 nike

这个问题基于MongoDB,如何通过选择多个条件来检索选定的项目。就像Mysql中的IN条件

SELECT * FROM venuelist WHERE venueid IN (venueid1, venueid2)

我附上了我用过的 json 数据结构。[Ref: JSON STRUCTUE OF MONGODB]

例如,它在 field 列表中有一个 field 列表,它有几个属性 field id 和用户代理名称和总数的总和作为值。用户代理表示用户操作系统、浏览器和设备信息。在这种情况下,我使用了 os 分发。在那种情况下,我计算的是 linux,ubuntu 计算特定的 field ID。

就是这样,

"sum" : [
{
"name" : "linux",
"value" : 12
},
{
"name" : "ubuntu",
"value" : 4
}
],

最后,我想通过在 MongoDB 的一个查找查询中选择场所 ID 列表来获取所有 linux 用户计数。

例如,我想通过条件 id VID1212VID4343 来选择所有 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 处理数据

expected out put is :

output

  • linux : 12+2 = 14
  • ubuntu : 4+0 = 4

Don't consider inner list in venuelist.

最佳答案

您需要使用聚合框架,在其中运行聚合管道,该管道首先根据以下条件过滤集合中的文档venueList ids 使用 $match 运算符。

第二个管道需要展平 venueListsum 子文档数组,以便文档中的数据在管道中作为非规范化条目进一步处理。 $unwind 运算符在这里很有用。

使用 $match 的进一步过滤器 在展开后是必需的,以便只允许您要聚合的文档进入下一个管道。

主管道将是 $group 运算符阶段,它使用累加器运算符 $sum 聚合过滤后的文档以创建所需的总和。为了得到想要的结果,你需要使用像 $cond 这样的三元运算符。 创建独立的计数字段,因为这会将文档数提供给 $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"
}
}
}
}
])

关于json - 通过在golang中检查MongoDB中的多个属性值来检索项目列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39943111/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com