MongoDB агрегирует вложенный документ, чтобы показывать только три одновременно

#mongodb #mongoose #aggregate #nested-documents

#mongodb #mongoose #агрегировать #вложенные документы

Вопрос:

Вот моя таблица:

     {
        "_id" : ObjectId("5f2e8e0d4976ed2c04fc2e90"),
        "reference" : "5f2e8e0d4976ed2c04fc2e8f",
        "id" : "5e87187f6e8c15766e6994f8",
        "name" : "no name",
        "items" : [
                {
                        "_id" : ObjectId("5f2e994336caf138c13560fc"),
                        "requestedItems" : "5e87187f6e8c15766e6994f8",
                        "name" : "no name",
                },
                {
                        "_id" : ObjectId("5f2e994336caf138c135601c"),
                        "requestedItems" : "5e87187f6e8c15766e6994f8",
                        "name" : "no name",
                },
                {
                        "_id" : ObjectId("5f2e994336caf138c135201c"),
                        "requestedItems" : "5e87187f6e8c15766e6994f8",
                        "name" : "no name",
                },
                {
                        "_id" : ObjectId("5f2e994336caf138c139521c"),
                        "requestedItems" : "5e87187f6e8c15766e6994f8",
                        "name" : "no name",
                },
                {
                        "_id" : ObjectId("5f2e994336caf138c139504f"),
                        "requestedItems" : "5e87187f6e8c15766e6994f8",
                        "name" : "no name",
                },

        ],
        "createdAt" : ISODate("2020-08-08T11:35:41.675Z"),
        "updatedAt" : ISODate("2020-08-18T13:34:43.077Z"),
        "date" : "8-8-2020",
        "__v" : 0
}
  

Я ищу запрос только к последним трем вложенным документам в «ITEMS». Я пробовал MongoDB aggregate framework, но безуспешно. Вот что у меня получилось. Любая помощь там была бы очень признательна.

     reqInventory.aggregate([
 {$match:{"id" : "5e87187f6e8c15766e6994f8"}},
  { $addFields: {
    items: {
      $map: {
        input: '$items',
        as: 'new',
        in: {
          requestedItems : '$$new.requestedItems',
          name : '$$new.name',
          items: { $slice: [ '$$new.items', 3 ] }
          
        }
      }
    }
  }}
  

Ответ №1:

Вы можете просто использовать $slice прямое поле в массиве с отрицательным количеством,

 reqInventory.aggregate([
  {
    $match: { "id": "5e87187f6e8c15766e6994f8" }
  },
  {
    $addFields: { items: { $slice: ["$items", -3] } }
  }
])
  

Игровая площадка

Ответ №2:

Вы можете напрямую использовать project

 reqInventory.aggregate([
      {
$match:{"id" : "5e87187f6e8c15766e6994f8"}
},
          {
            '$project': {
              'last3ITems': {
                '$slice': [
                  '$$ROOT.items', 2, 5
                ]
              }
            }
          }
        ]
  

Ответ №3:

Вы можете использовать { $limit: <positive integer> } для ограничения ваших ответов.

Вот способ, который дает вам больше объяснений https://docs.mongodb.com/manual/reference/operator/aggregation/limit /