首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过检查MongoDB中的多个属性值检索项目列表

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

Stack Overflow用户
提问于 2016-10-09 11:33:50
回答 1查看 1.4K关注 0票数 5

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

从静脉列表中选择* (venueid1,venueid2)

我已经附加了我使用过的json数据结构。参考: MONGODB 的JSON。

作为一个例子,它有一个venueList然后在场地列表中,它有多个属性地点id和用户代理名称之和以及总数量,因为value.user代理意味着用户Os、浏览器和设备信息。在本例中,我使用os distribution.In --在这个例子中,我是count,ubuntu --依赖于特定的venueid。

就像这样,

代码语言:javascript
运行
复制
"sum" : [
    {
        "name" : "linux",
        "value" : 12
    },
    {
        "name" : "ubuntu",
        "value" : 4
    }
],

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

例如,我希望通过对场地id为id VID1212还是VID4343进行调整来选择linux用户的所有计数。

参考文献: MONGODB的JSON结构

代码语言:javascript
运行
复制
{
    "_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处理数据。

预期产出如下: 输出

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

不要考虑内部清单在静脉列表。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-09 14:52:23

您需要使用聚合框架,其中将运行一个聚合管道,该管道首先使用venueList操作符根据$match‘d过滤集合中的文档。

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

在展开之后,还需要使用$match进行进一步的筛选,以便只允许要聚合的文档进入下一个管道。

主要管道是$group操作符阶段,它聚合过滤后的文档,使用累加器运算符$sum创建所需的和。对于所需的结果,您需要使用像$cond这样的10进制运算符来创建独立的计数字段,因为这将根据名称值将文档数输入到$sum表达式。

综上所述,请考虑运行以下管道:

代码语言:javascript
运行
复制
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中的指导来转换上面的管道

为了获得更灵活和性能更好的替代方案,它的执行速度要比上面的要快得多,并且还要考虑到和列表的未知值,请按以下方式运行替代管道

代码语言:javascript
运行
复制
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"
                }
            }
        }
    }
])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39943111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档