Mongodb文档:有没有办法计算有条件的子文档?

Mongodb文档:有没有办法计算有条件的子文档?,mongodb,subdocument,Mongodb,Subdocument,我有带有子文档的文档,其中子文档中的“星号””字段有“1”或“0”。我想根据“星号””字段中的值在文档级别对它们进行计数 这是当前文档的外观: { "name": "Hotel A", "category": "hotel", "reviews": [ { "title": "A", "stars": 1 }, { "title": "B", "stars": 1 }, { "titl

我有带有子文档的文档,其中子文档中的“星号””字段有“1”或“0”。我想根据“星号””字段中的值在文档级别对它们进行计数

这是当前文档的外观:

{
  "name": "Hotel A",
  "category": "hotel",
  "reviews": [
    {
      "title": "A",
      "stars": 1
    },
    {
      "title": "B",
      "stars": 1
    },
    {
      "title": "C",
      "stars": 0
    }
  ],
  "total_reviews": 3
},{
  "name": "Hotel B",
  "category": "hotel",
  "reviews": [
    {
      "title": "A",
      "stars": 1
    },
    {
      "title": "B",
      "stars": 1
    },
    {
      "title": "C",
      "stars": 0
    },
        {
      "title": "D",
      "stars": 0
    },
    {
      "title": "E",
      "stars": 1
    },
    {
      "title": "F",
      "stars": 0
    }
  ],
"total_reviews": 6
}
这是预期的产出:

{
  "name": "Hotel A",
  "category": "hotel",
  "reviews": [
    {
      "title": "A",
      "stars": 1
    },
    {
      "title": "B",
      "stars": 1
    },
    {
      "title": "C",
      "stars": 0
    }
  ],
  "positive_reviews": 2,
  "negative_reviews": 1,
  "total_reviews": 3
},{
  "name": "Hotel B",
  "category": "hotel",
  "reviews": [
    {
      "title": "A",
      "stars": 1
    },
    {
      "title": "B",
      "stars": 1
    },
    {
      "title": "C",
      "stars": 0
    },
        {
      "title": "D",
      "stars": 0
    },
    {
      "title": "E",
      "stars": 1
    },
    {
      "title": "F",
      "stars": 0
    }
  ],
"positive_reviews": 3,
"negative_reviews": 3,
"total_reviews": 6
}
通过添加两个新字段:“positive\u reviews”if{“reviews.stars”:1}和“negative\u reviews”if{“reviews.stars”:0},具有计数值

请尝试以下操作:

db.collection.aggregate([
    {
        $project: {
            "_id" : 1,
            "name" : 1,
            "category" : 1,
            "reviews" : 1,
            "positive_reviews":
            {
               $reduce: 
                 {
                   input: "$reviews",
                   initialValue: 0,
                   in: { 
                       $add: ["$$value", { $cond:[{ $eq: ["$$this.stars", 1]} , 1, 0 ] } ] 
                   }
                 }
            },
            "negative_reviews":
            {
               $reduce: 
                 {
                   input: "$reviews",
                   initialValue: 0,
                   in: { 
                       $add: ["$$value", { $cond:[{ $eq: ["$$this.stars", 0]} , 1, 0 ] } ] 
                   }
                 }
            },
            "total_reviews": { $size: "$reviews"}
        }
    }
])
结果回应:

/* 1 createdAt:12/04/2019, 18:24:50*/
{
    "_id" : ObjectId("5cb08a9a952e3a179190d996"),
    "name" : "Hotel A",
    "category" : "hotel",
    "reviews" : [
        {
            "title" : "A",
            "stars" : 1
        },
        {
            "title" : "B",
            "stars" : 1
        },
        {
            "title" : "C",
            "stars" : 0
        }
    ],
    "positive_reviews" : 2,
    "negative_reviews" : 1,
    "total_reviews" : NumberInt(3)
},

/* 2 createdAt:12/04/2019, 18:24:50*/
{
    "_id" : ObjectId("5cb08a9a952e3a179190d997"),
    "name" : "Hotel B",
    "category" : "hotel",
    "reviews" : [
        {
            "title" : "A",
            "stars" : 1
        },
        {
            "title" : "B",
            "stars" : 1
        },
        {
            "title" : "C",
            "stars" : 0
        },
        {
            "title" : "D",
            "stars" : 0
        },
        {
            "title" : "E",
            "stars" : 1
        },
        {
            "title" : "F",
            "stars" : 0
        }
    ],
    "positive_reviews" : 3,
    "negative_reviews" : 3,
    "total_reviews" : NumberInt(6)
}

这正是我想要的!非常感谢您的及时回复!