MongoDB多个计数,单个文档,数组

时间:2019-05-17 01:13:40

标签: mongodb mongodb-query

我一直在搜索stackoverflow,但找不到确切的信息,希望有人可以提供帮助。我想基于该文档的数组针对单个文档提交单个查询,以获取多个计数。

我的数据:

db.myCollection.InsertOne({
  "_id": "1",
  "age": 30,
  "items": [
    {
      "id": "1",
      "isSuccessful": true,
      "name": null
    },{
      "id": "2",
      "isSuccessful": true,
      "name": null
    },{
      "id": "3",
      "isSuccessful": true,
      "name": "Bob"
    },{
      "id": "4",
      "isSuccessful": null,
      "name": "Todd"
    }
  ]
});

db.myCollection.InsertOne({
  "_id": "2",
  "age": 22,
  "items": [
    {
      "id": "6",
      "isSuccessful": true,
      "name": "Jeff"
    }
  ]
});

我需要返回的是文档以及与该文档的items数组关联的计数。在此示例中,文档_id =“ 1”:

{
  "_id": "1", 
  "age": 30,
  {
    "totalIsSuccessful" : 2,
    "totalNotIsSuccessful": 1,
    "totalSuccessfulNull": 1,
    "totalNameNull": 2
  }
}

我发现我可以使用以下类似的方法在4个查询中获得此查询,但我真的希望它是一个查询。

db.test1.aggregate([
  { $match : { _id : "1" } },
  { "$project": {
    "total": {
      "$size": {
        "$filter": {
          "input": "$items",
          "cond": { "$eq": [ "$$this.isSuccessful", true ] }
        }
      }
    }
  }}
])

谢谢。

1 个答案:

答案 0 :(得分:1)

我假设您的预期结果无效,因为您在另一个对象中间有一个对象文字,并且您将totalIsSuccessful的{​​{1}}设为id:1,似乎应该是2。这么说...

您可以通过3得到相似的输出,然后与$unwind$sum分组:

$cond

输出为:

db.collection.aggregate([
  { $match: { _id: "1" } },
  { $unwind: "$items" },
  { $group: { 
    _id: "_id",
    age: { $first: "$age" },
    totalIsSuccessful: { $sum: { $cond: [{ "$eq": [ "$items.isSuccessful", true ] }, 1, 0 ] } },
    totalNotIsSuccessful: { $sum: { $cond: [{ "$ne": [ "$items.isSuccessful", true ] }, 1, 0 ] } },
    totalSuccessfulNull: { $sum: { $cond: [{ "$eq": [ "$items.isSuccessful", null ] }, 1, 0 ] } },
    totalNameNull: { $sum: { $cond: [ { "$eq": [ "$items.name", null ]}, 1, 0] } } }
  }
])

您可以see it working here