【发布时间】:2019-01-20 04:11:30
【问题描述】:
我有一个用户集合,其中包含每个用户的大量属性。一个属性是一个数组('guestlist_submitted'),我试图根据日期字段返回该数组中最近的 3 个项目。
使用 Mongoose,我可以针对用户对象上的特定属性,但我似乎无法限制或排序它们。
我尝试使用切片和日期计算来返回最近的 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);
}
});
【问题讨论】: