Как получить только запрошенные объекты из массива в монго? - PullRequest
1 голос
/ 13 мая 2019

Мой документ имеет следующую структуру:

{
    "sku": "x",
    "prices": [{"code": 1}, {"code": 2}, {"code": 3}]
}

Я пытаюсь запросить только те объекты внутри массива цен, которые имеют код 1 или 3:

db.my_coll.find({
    sku: "x"
}, {
    _id: 0,
    prices: {
        $elemMatch: {
            $or: [{code: 1}, {code: 3}]
        }
    }
})

Но результаттолько получает code 1:

{ "prices" : [ {"code" : 1} ] }

Результат должен быть:

{ "prices" : [ {"code" : 1}, {"code": 3} ] }

Как я могу получить только определенный объект внутри массива?

Массив цен имеет много объектов (минимум 100)

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Еще один более старый способ сделать это, и если у вас нет версии MongoDB 3.2 (поскольку там был введен $ filter ), используйте $ unwind / $ match / $ group & $ project:

db.my_coll.aggregate([
  {
    $unwind: "$prices"
  },
  {
    $match: {
      sku: "x",
      "prices.code": {
        $in: [
          1,
          3
        ]
      }
    }
  },
  {
    $group: {
      _id: "$_id",
      prices: {
        $push: "$prices"
      }
    }
  },
  {
    $project: {
      _id: 0,
      prices: 1
    }
  }
])

Вы можете увидеть результаты здесь: https://mongoplayground.net/p/JQ4xRomk3VM

В целом, подход mickl выглядит так, как вы хотели бы, если вы находитесь на MongoDB 3.2 и выше.

0 голосов
/ 13 мая 2019

$ elemMatch возвращает только первый соответствующий элемент, вместо него можно использовать $ filter с $ match вместо:

db.my_coll.aggregate([
    {
        $match: { sku: "x" }
    },
    {           
        $project: {
            _id: 0,
            prices: {
                $filter: {
                    input: "$prices",
                    cond: {
                        $in: [ "$$this.code", [ 1, 3 ] ]
                    }
                }
            }
        }
    },
    {
        $match: {
            prices: { $ne: [] } // if you don't want to get empty arrays in result set
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...