#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 /