Для этого необходимо использовать операторы агрегирования $ slice и $ push , чтобы выбрать и добавить необходимые элементы записи (по индексу) в массив соответственно.
Например, в коллекции posts
есть три документа (здесь я пропустил поле _id
):
{
"username" : "user2",
"posts" : [
{
"id" : 1,
"text" : "123"
},
{
"id" : 2,
"text" : "456"
},
{
"id" : 3,
"text" : "789"
},
{
"id" : 4,
"text" : "000"
}
]
}
{
"username" : "user1",
"posts" : [
{
"id" : 1,
"text" : "abc"
},
{
"id" : 2,
"text" : "def"
},
{
"id" : 3,
"text" : "ghi"
},
{
"id" : 4,
"text" : "zzz"
}
]
}
{
"username" : "user99",
"posts" : [ ]
}
В оболочке Монго:
> var users = [ "user1", "user2" ]
> var startIx = 1, noOfElements = 2
> db.posts.aggregate([
{ $project: { _id: 0, username: 1, posts: 1, usersMatch: { $in: [ "$username", users ] } } },
{ $match: { usersMatch: true } },
{ $addFields: { posts: { $slice: [ "$posts", startIx, noOfElements ] } } },
{ $group: { _id: null, postsOfSelectedUsers: { $push: "$posts"} } },
{ $project: { _id: 0, selectedUsers: users, postsOfSelectedUsers: 1 } }
])
Выход:
{
"postsOfSelectedUsers" : [
[
{
"id" : 2,
"text" : "456"
},
{
"id" : 3,
"text" : "789"
}
],
[
{
"id" : 2,
"text" : "def"
},
{
"id" : 3,
"text" : "ghi"
}
]
],
"selectedUsers" : [
"user1",
"user2"
]
}
ПРИМЕЧАНИЕ : Это решение, но его можно улучшить или переработать (Iдумаю).