Как автоматически добавить все поля, кроме одного, при агрегировании? - PullRequest
2 голосов
/ 04 июня 2019

У меня есть коллекция mongodb, которая содержит объекты, которые имеют несколько свойств (возможно, много).Одним из них является массив другого типа объекта, и этот тип имеет логическое свойство StateChanged.

. Я хочу сделать запрос, возвращающий все записи из этой коллекции, и отфильтровать массив, чтобы получить только документыс StateChanged = true.

Вот что я уже сделал:

db.getCollection('Cycles').aggregate([
    {
        $project: {
            _id: 0,
            // Here I could add Field1: 1, Field2: 1,...
            'Subcycles' : {
                $filter : {
                    input: '$Subcycles',
                    as : 'sub',
                    cond: { $eq: ['$$sub.StateChanged',true]}
                }
            }
        }
    }
])

Однако это только приносит мне коллекцию "Subcycles".Я хочу включить другие поля в корневой документ.

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

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

Ответы [ 2 ]

3 голосов
/ 04 июня 2019

Вы можете использовать $addFields вместо $project.Он автоматически заменит новое поле существующим.

db.getCollection("Cycles").aggregate([
  { "$addFields": {
    "Subcycles": {
      "$filter": {
        "input": "$Subcycles",
        "as": "sub",
        "cond": { "$eq": ["$$sub.StateChanged", true] }
      }
    }
  }},
  { "$project" : { "_id": 0 }}
])
2 голосов
/ 04 июня 2019

Вы можете использовать $ addFields , а затем использовать $ project , чтобы исключить _id поле:

db.getCollection('Cycles').aggregate([
    {
        $addFields: {
            'Subcycles' : {
                $filter : {
                    input: '$Subcycles',
                    as : 'sub',
                    cond: { $eq: ['$$sub.StateChanged',true]}
                }
            }
        }
    },
    {
       $project: {
          _id: 0
       }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...