我有一个用户集合,其中包含每个用户的大量属性。一个属性是一个数组(“ guestlist_submitted”),我试图根据日期字段返回该数组中的最新3个项目。
使用猫鼬,我可以在用户对象上定位该特定属性,但似乎无法对其进行限制或排序。
我尝试使用切片和日期计算来返回最近的3个整数,但是我一直在努力使它正确,并且不确定什么地方出错了。
我尝试在查询构建器上使用排序/限制,但是我了解到,尽管我在查询构建器中说了“ select('guestlist_submitted')”,但这些不适用于我所针对的属性内的数组。>
当我只针对用户对象的属性返回结果时,它以一个数组的形式出现,该数组内部有一个对象,而该对象内部有另一个数组。我在遍历它以定位内部数组以使用切片和日期排序时遇到问题。
第一次尝试
Users.
find({ fbid: req.query.fbid}).
select('guestlist_submitted -_id').
sort({"guestlist_submitted.date": 'desc'}).
limit(3).
exec((err, result) => {
if (err) throw (err));
if (result) {
res.send(result);
}
第二次尝试:
Users.
find({ fbid: req.query.fbid}).
select('guestlist_submitted -_id').
exec((err, result) => {
if (err) res.send(JSON.stringify(err));
if (result) {
const slicedArr = result.guestlist_submitted.slice(0,1);
const sortedResultArr = slicedArr.sort(function(a,b){return new Date(b.date) - new Date(a.date); });
const newResultArr = sortedResultArr.slice(0, 2);
res.send(newResultArr);
}
我能得到的最好结果是“ guestlist_submitted”和整个数组(未排序),并将其放在数组中的对象内部。
我希望输出结果是可以在客户端上显示的新数组中guestlist_submitted数组的3个最新结果。
预先感谢您的帮助
编辑-解决方案
我最终想出了如何使用aggregate()来获得想要的东西
Users.aggregate([
{
$match: {fbid: req.query.fbid}
},
{
$unwind: "$guestlist_submitted"
},
{
$sort: {'guestlist_submitted.date': -1}
},
{
$limit: 2
},
{
$group: {_id: '$_id', guestlist_submitted: {$push: '$guestlist_submitted'}}
},
{
$project: { guestlist_submitted: 1, _id: 0 }
}
]).exec((err, result) => {
if (err) res.send(JSON.stringify(err));
if (result) {
console.log(result);
res.send(result);
}
});
答案 0 :(得分:0)
我最终想出了如何使用aggregate()来获得想要的东西
Users.aggregate([
{
$match: {fbid: req.query.fbid}
},
{
$unwind: "$guestlist_submitted"
},
{
$sort: {'guestlist_submitted.date': -1}
},
{
$limit: 2
},
{
$group: {_id: '$_id', guestlist_submitted: {$push: '$guestlist_submitted'}}
},
{
$project: { guestlist_submitted: 1, _id: 0 }
}
]).exec((err, result) => {
if (err) res.send(JSON.stringify(err));
if (result) {
console.log(result);
res.send(result);
}
});