Запрос количества подэлементов с условием в Mon go DB - PullRequest
1 голос
/ 13 января 2020

Я новичок в пн go БД и был бы признателен за помощь в выполнении следующей задачи запроса.

У меня есть коллекция документов, которая выглядит следующим образом:

{
    "field_1" : {
      "subfield_1" : {
        "subsubfield_1" : "true",
        "subsubfield_2" : "false",
        "subsubfield_3" : "true"
        },
      "subfield_2" : "sf2"
      },
    "field_2" : {
      "subfield_1" : {
        "subsubfield_1" : "true",
        "subsubfield_2" : "false"
        },
      "subfield_2" : "sf2"
      },
    "field_3" : {
      "subfield_1" : {
        "subsubfield_1" : "true",
        "subsubfield_2" : "false",
        "subsubfield_3" : "false"
        },
      "subfield_2" : "sf2"
      }
}

И Я пытаюсь сделать запрос так, чтобы я для каждого элемента в коллекции (1) точно указывал, какие поля возвращать (в этом случае subfield_1 и subfield_2, и (2) для subfield_1 возвращает только счетчик true элементов. Поэтому я хотел бы, чтобы выходные данные выглядели следующим образом:

{
  {
    "subfield_1" : 2,
    "subfield_2" : "sf2"
  },
  {
    "subfield_1" : 1,
    "subfield_2" : "sf2"
  },
  {
    "subfield_1" : 1,
    "subfield_2" : "sf2"
  }
}

Я пробовал этот код, но он дает только количество записей в subfield_1 для каждого элемента:

db.getCollection('myCollection').aggregate(
  {
  $match: {<some other condition>}
  },
  {
  $project: {
    subfield_2: 1, 
    subfield_1: {'$size': '$subfield_1'}
  }
  }
)

Заранее спасибо!

1 Ответ

0 голосов
/ 13 января 2020

Вам нужно запустить $ objectToArray , чтобы преобразовать вложенный структурирующий элемент в массив ключей и значений, а затем использовать $ unwind , чтобы получить отдельный документ для каждого вложенного документа. Затем вы можете запустить еще один $objectToArray вместе с $ filter , чтобы получить только true значений:

db.collection.aggregate([
    {
        $project: {
            doc: { $objectToArray: "$$ROOT" }
        }
    },
    {
        $unwind: "$doc"
    },
    {
        $match: { $expr: { $ne: [ "$doc.k", "_id" ] } }
    },
    {
        $project: {
            _id: 0,
            subfield_1: { $size: { $filter: { input: { $objectToArray: "$doc.v.subfield_1" }, cond: { $eq: [ "$$this.v", "true" ] } } } },
            subfield_2: "$doc.v.subfield_2"
        }
    }
])

Пн go Детская площадка

...