mongodb - 如何使用 mongoDB 查找一个文档中某个键的计数?

标签 mongodb

我的集合中有以下结构:

users:[
  {
    "name":"ABC",
    "address":{
    "city":"London",
    "country":"UK",
    }
  },
  {
    "name":"XYZ",
    "address":{
      "city":"London",
      "country":"UK",
     }
  },
  {
    "name":"PQR",
    "address":{
    "city":"NewYork",
    "country":"US",
    }
  }
]

我想要计算“地址”和“名称”中“城市”键出现的次数。

我想查询上面的集合并想要以下输出:

[{
"name":"ABC",
"city":"London",
"count":2
},{
"name":"XYZ",
"city":"London",
"count":2
}, {
"name":"PQR",
"city":"NewYork",
"count":1
}
]

最佳答案

我模拟了你的收藏

{
    "_id" : ObjectId("547c30ae371ea419f07b9550"),
    "users" : [ 
        {
            "name" : "ABC",
            "address" : {
                "city" : "London",
                "country" : "UK"
            }
        }, 
        {
            "name" : "XYZ",
            "address" : {
                "city" : "London",
                "country" : "UK"
            }
        }, 
        {
            "name" : "PQR",
            "address" : {
                "city" : "NewYork",
                "country" : "US"
            }
        }
    ]
}

然后我使用 aggregate framework

db.coll.aggregate([

{
  $unwind:"$users"  
},
{
    $group:{
        _id:"$users.address.city",
        name:{$push:"$users.name"},
        city:{$first:"$users.address.city"},
        count:{$sum:1}
    }
},{
    $unwind:"$name"
},{
    $project:{
        _id:0,
        "city":"$_id",
        "name":1,
        "city":1,
        "count":1
    }

}])

结果:

{
    "result" : [ 
        {
            "name" : "PQR",
            "city" : "NewYork",
            "count" : 1
        }, 
        {
            "name" : "ABC",
            "city" : "London",
            "count" : 2
        }, 
        {
            "name" : "XYZ",
            "city" : "London",
            "count" : 2
        }
    ],
    "ok" : 1
}

提出问题后更新

我添加了一个新文档

{
    "_id" : ObjectId("547c394c371ea419f07b9551"),
    "users" : [ 
        {
            "address" : {
                "city" : "Livorno",
                "country" : "LI"
            }
        }, 
        {
            "address" : {
                "city" : "Livorno",
                "country" : "LI"
            }
        }, 
        {
            "address" : {
                "city" : "NewYork",
                "country" : "US"
            }
        }
    ]
}

和新查询

db.coll.aggregate([

{
  $unwind:"$users"  
},
{
    $group:{
        _id:"$users.address.city",        
        "name": {
                $push:{"$ifNull": ["$users.name","$_id"]}
           },
        city:{$first:"$users.address.city"},
        count:{$sum:1}
    }
},{
    $unwind:"$name"
},{
    $project:{
        _id:0,
        "city":"$_id",
        "name":1,
        "city":1,
        "count":1
    }

}])

结果:

{
    "result" : [ 
        {
            "name" : "PQR",
            "city" : "NewYork",
            "count" : 2
        }, 
        {
            "name" : ObjectId("547c394c371ea419f07b9551"),
            "city" : "NewYork",
            "count" : 2
        }, 
        {
            "name" : ObjectId("547c394c371ea419f07b9551"),
            "city" : "Livorno",
            "count" : 2
        }, 
        {
            "name" : ObjectId("547c394c371ea419f07b9551"),
            "city" : "Livorno",
            "count" : 2
        }, 
        {
            "name" : "ABC",
            "city" : "London",
            "count" : 2
        }, 
        {
            "name" : "XYZ",
            "city" : "London",
            "count" : 2
        }
    ],
    "ok" : 1
}

关于mongodb - 如何使用 mongoDB 查找一个文档中某个键的计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27224341/

相关文章:

javascript - 在 forEach 循环 javascript 中创建对象时出现问题

php - 如何从 MongoDB 集合创建 JSON 提要

node.js - 如何将评论计数填充到项目列表中?

mongodb - Node + Mongoose : Get last inserted ID?

mongodb - 如何将后端计时器与移动应用程序同步

javascript - 如何将 NOT (A AND B) 转换为 mongodb 查询

java - MongoDB Reactive Streams 在执行查询时挂起

node.js - Mongoose 设置默认数组大小和值

mongodb - 使用 MongoDB 聚合 $group 获取百分比

node.js - 循环内的 Mongoose 查询