我正在尝试查询此模型:
user = {
'email': 'test@test.com',
'pages': [
{
'name': 'best page',
'sessions': [
{
sessionName: 'abc',
},
]
}, ..
]
};
基本上我想从一个按session._id
DESC排序的页面中选择3个会话数据。
User.findOne({ '_id': userId, 'pages._id': pageId })
.select('pages.sessions')
.sort({ 'pages.sessions._id': -1 })
.limit(3)
.exec(function(err, user) {
console.log(user);
});
但没有任何工作......它返回的是一系列页面(而不是1)。数据未排序,并且有所有会话而不是3。
我应该改变什么?
编辑:发现我无法对其进行排序,我可以使用slice('pages.sessions')
来限制它,但我怎样才能只获得1页而不是数组?
答案 0 :(得分:0)
您可以使用以下aggregation:
Users.aggregate([{
$match: {
"_id": "1",
"pages._id": "1"
}
}, {
$project: {
_id: 1,
email: 1,
pages: {
$filter: {
input: '$pages',
as: 'pages',
cond: { $eq: ['$$pages._id', "1"] }
}
}
}
}, {
$unwind: "$pages"
}, {
$project: {
_id: 1,
email: 1,
pages: {
_id: 1,
name: 1,
sessions: {
$slice: ["$pages.sessions", 3]
}
}
}
}], function(err, user) {
console.log(user);
})
首先$match
您的文档需要_id
/ pages._id
,然后filter
pages
数组取决于pages._id
。然后$unwind
pages
可以在下一个project
中slices
。