MongoDB: Суммирование количества раз значения == "Some String" в объекте в массиве - PullRequest
1 голос
/ 05 июля 2019

У меня есть документ MongoDB, который выглядит примерно так:

{
  "_id": 000000000001,
  "sample": [
    {
      "_id": {
        "$oid": "12345678910"
      },
      "Phone": 5555555555,
      "LastName": "Musk",
      "FirstName": "Elon",
      "responses": {
        "question1": "hello",
        "question2": "world"
      }
    },
    {
      "_id": {
        "$oid": "12345678911"
      },
      "Phone": "1111111111",
      "LastName": "Jobs",
      "FirstName": "Steve",
      "responses": {
        "question1": "goodbye",
        "question2": "world"
      }
    }
  ]
}

Я хочу получить $sum всех людей, которые дали ответ hello на question1, и всех людей, которые дали ответ world на question2.

Например. Я хочу, чтобы ответ выглядел примерно так:

{ 'question1': 1, 'question2': 2 }

Мой запрос выглядит так, но он не работает. Это только возвращает 0 для любой заданной суммы, когда я знаю, что это не так.

db.collection(collection).aggregate([
  { $match : { } },
  { $group: {
     _id: "responses", 
     "question1": { $sum: { $cond: [ { $eq: [ "$sample.responses.question1", "hello"] }, 1, 0 ] } },
     "question2": { $sum: { $cond: [ { $eq: [ "$sample.responses.question2", "world"] }, 1, 0 ] } }
    }
  }
])

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 05 июля 2019

Вам нужно использовать $ unwind ваших данных, чтобы получить один документ на ответ, и использовать $ facet для запуска двух отдельных критериев фильтрации.Затем вам нужно $ size , чтобы получить длину оставшегося набора данных, попробуйте:

db.col.aggregate([
    { $unwind: "$sample" },
    { $project: { responses: { $objectToArray: "$sample.responses" } } },
    { $unwind: "$responses" },
    {
        $facet: {
            hello: [ { $match: { $expr: { $and: [ { $eq: [ "$responses.k", "question1" ] }, { $eq: [ "$responses.v", "hello" ] } ] } } } ],
            world: [ { $match: { $expr: { $and: [ { $eq: [ "$responses.k", "question2" ] }, { $eq: [ "$responses.v", "world" ] } ] } } } ],
        }
    },
    {
        $project: {
            question1: { $size: "$hello" },
            question2: { $size: "$world" },
        }
    }
])
...