MongoDB - Найти документ по _id и вернуть без дочерних элементов по значению - PullRequest
0 голосов
/ 29 марта 2020

Я работаю над проектом, в котором пытаюсь вернуть документ, но исключаю некоторые дочерние поля в зависимости от статуса. Например, если статус отключен, я не хочу, чтобы этот ребенок вернулся. Но все остальные записи возвращаются, если они не содержат отключенных.

Запрос включает _id документа, который я хочу найти и вернуть, без «отключенных» дочерних записей.

Как выбрать документ с помощью _id, затем исключить записи из дочернего массива на основе значения.

Спасибо

Мой документ выглядит следующим образом:

{
    "_id" : ObjectId("5e7bb266071f9601b6ad8f4e"),
    "name" : "Test Document",
    "postcode" : "90210",
    "colors" : [ 
        {
            "_id" : ObjectId("5e7d276a05674f0cf49bdcec"),
            "color" : "blue",
            "status": "active"

        }, 
        {
            "_id" : ObjectId("5e7d276a05674f0cf49bdceg"),
            "color" : "red",
            "status": "active"
        }, 
        {
            "_id" : ObjectId("5e7d276a05674f0cf49bdceh"),
            "color" : "green",
            "status" : "disabled"
        }
    ]
}

Как мне вернуть:

{
    "_id" : ObjectId("5e7bb266071f9601b6ad8f4e"),
    "name" : "Test Document",
    "postcode" : "90210",
    "colors" : [ 
        {
            "_id" : ObjectId("5e7d276a05674f0cf49bdcec"),
            "color" : "blue",
            "status": "active"

        }, 
        {
            "_id" : ObjectId("5e7d276a05674f0cf49bdceg"),
            "color" : "red",
            "status": "active"
        }
    ]
}

Я пробовал варианты:

    findr.aggregate([

        {
            $match: {
                $and: [{
                    _id: mongodb.ObjectId(_id)
                }, {
                    'color.status': 'active'
                }]
            }
        },
        {
            $project: {
                _id
                name: 1,
                postcode: 1,
                colors: {
                    $filter: {
                        input: '$colors',
                        as: 'color',
                        cond: {
                            $eq: ['$$color.status', 'active']
                        }
                    }
                }
            }
        }

    ])

1 Ответ

1 голос
/ 29 марта 2020

Вот код для замены.

  db.collection.aggregate([
  {
    $match: {
      "_id": ObjectId("5e7bb266071f9601b6ad8f4e")
    }
  },
  {
    $project: {
      items: {
        $filter: {
          input: "$colors",
          as: "item",
          cond: {
            $eq: [
              "$$item.status",
              "active"
            ]
          }
        }
      }
    }
  }
])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...