Запрос, чтобы получить конкретный суб-документ с использованием агрегации в MongoDB? - PullRequest
0 голосов
/ 28 апреля 2019

Я хотел бы знать запрос, в котором я мог бы получить конкретный поддокумент, используя его ObjectId или даже имя «store», если проще, используя метод агрегации.Я почти уверен, что могу использовать $ project, но я не уверен, как применить это к ObjectId.

Я могу использовать метод find, но мне нужно, чтобы он был в методе агрегации, чтобы mongo возвращал мне имена элементов, а не ObjectId.

db.stores.aggregate([
  {$unwind: '$inventory'},
  {$lookup: {
    from: 'items',
    localField: 'inventory.item',
    foreignField: '_id',
    as: 'itemsData'
   }},
  {$unwind: '$itemsData'},
  {$group:{
    _id: "$_id",
    inventory: { $push: "$inventory" },
    itemsData: { $push: "$itemsData" }
  }}
]).pretty()

В моей коллекции пять магазинов.Этот запрос возвращает все пять документов, таких как приведенный ниже код, всего пять раз.Но я хочу указать магазины, которые будут возвращены, используя его ObjectId.


{
        "_id" : ObjectId("5cc0d6ad1ea502abb28b52cc"),
        "inventory" : [
                {
                        "item" : ObjectId("5cbe70bd1ea502abb28b52a4"),
                        "amount" : 9
                },
                {
                        "item" : ObjectId("5cbe70bd1ea502abb28b52a1"),
                        "amount" : 5
                },
                {
                        "item" : ObjectId("5cbe70bd1ea502abb28b52a7"),
                        "amount" : 2
                },
                {
                        "item" : ObjectId("5cbe70bd1ea502abb28b529e"),
                        "amount" : 5
                }
        ],
        "itemsData" : [
                {
                        "_id" : ObjectId("5cbe70bd1ea502abb28b52a4"),
                        "item" : "beans",
                        "price" : NumberDecimal("53,75")
                },
                {
                        "_id" : ObjectId("5cbe70bd1ea502abb28b52a1"),
                        "item" : "bananas",
                        "price" : NumberDecimal("5.00")
                },
                {
                        "_id" : ObjectId("5cbe70bd1ea502abb28b52a7"),
                        "item" : "watermelon",
                        "price" : NumberDecimal("3.50")
                },
                {
                        "_id" : ObjectId("5cbe70bd1ea502abb28b529e"),
                        "item" : "broccoli",
                        "price" : NumberDecimal("5.50")
                }
        ]

}

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

1 Ответ

0 голосов
/ 28 апреля 2019

Как вы сказали, возвращать нужно только одно хранилище данных, поэтому вы можете использовать $ limit:

db.stores.aggregate([
   {$unwind: '$inventory'},
   {$lookup: {
      from: 'items',
      localField: 'inventory.item',
      foreignField: '_id',
      as: 'itemsData'
   }},
   {$unwind: '$itemsData'},
   {$group:{
      _id: "$_id",
      inventory: { $push: "$inventory" },
      itemsData: { $push: "$itemsData" }
   }},
   { $limit : 1}
  ]).pretty()

сейчас, если вы хотите вернуть определенные данные хранилища для возврата, используйте $ match Query:

db.stores.aggregate([
   { $match : { "_id" : ObjectId("5cc0d6ad1ea502abb28b52cc") }},
   {$unwind: '$inventory'},
   {$lookup: {
      from: 'items',
      localField: 'inventory.item',
      foreignField: '_id',
      as: 'itemsData'
   }},
   {$unwind: '$itemsData'},
   {$group:{
      _id: "$_id",
      inventory: { $push: "$inventory" },
      itemsData: { $push: "$itemsData" }
   }}
  ]).pretty()

Надеюсь, это было полезно.

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