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

2023-12-09

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

SELECT * FROMvenuelistWHEREvenueidIN(venueid1,venueid2)

我附上了我使用过的json数据结构。[参考:MONGODB 的 JSON 结构].

例如,它有一个场地列表,然后在场地列表中,它有几个属性场地ID和用户代理名称和总计数的总和作为值。用户代理意味着用户操作系统,浏览器和设备信息。在这种情况下,我使用了 os 发行版。在这种情况下,我计数 linux,ubuntu 计数特定的场地 ID。

就是这样,

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

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

例如,我想通过条件 if 场地 id 选择所有 Linux 用户计数VID1212 or VID4343

参考: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 包通过 mongodb 操作数据

预期输出是:

output

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

不要考虑场地列表中的内部列表。


您需要使用聚合框架,在其中运行聚合管道,该管道首先根据以下内容过滤集合中的文档 这venueListid 使用$match操作员。

第二条管道将需要扁平化venueList and sum子文档数组,以便将文档中的数据作为非规范化条目在管道中进一步处理。这$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"
                }
            }
        }
    }
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang中通过检查MongoDB中的多个属性值来检索项目列表 的相关文章

随机推荐