我有以下型号:
var followerSchema = new Schema({
id_follower: {type: Schema.Types.ObjectId, ref: 'Users'},
id_post: {type: Schema.Types.ObjectId, ref: 'Posts'}
});
我希望能够找到关注者列表的所有帖子。当我使用find时,它当然会多次返回同一个帖子,因为多个用户可以关注相同的帖子。
所以我尝试使用distinct,但我觉得“填充”后来不起作用。
这是我的代码:
followerModel
.distinct('id_post',{id_follower:{$in:followerIds}})
.populate('id_post')
.sort({'id_post.creationDate':1})
.exec(function (err, postFollowers) {
console.log(postFollowers);
})
它只返回帖子的数组,并且没有填充。
我是mongoDB的新手,但是根据mongoose的文档,“distinct”方法应该返回一个查询,就像“查找”方法一样。在查询中,您可以执行“填充”方法,因此我看不出我做错了什么。
我也试过使用查询的.distinct()方法,所以我的代码是这样的:
followerModel
.find({id_follower:{$in:followerIds}})
.populate('id_post')
.distinct('id_post')
.sort({'id_post.creationDate':1})
.exec(function (err, postFollowers) {
console.log(postFollowers);
})
在这种情况下它可以正常工作,但是在mongoose的文档中,当你在查询中使用distinct方法时,你需要提供一个回调函数,所以在我的日志中我总是得到错误。解决方法是使用虚拟回调函数,但我想避免这种情况......
有人知道为什么第一次尝试不起作用吗?如果第二种方法可以通过提供虚拟回调来接受吗?
答案 0 :(得分:5)
考虑到当前缺乏对猫鼬的支持,这会是正确的方法吗?
followerModel
.find({id_follower:{$in:followerIds}})
.distinct('id_post',function(error,ids) {
Posts.find({'_id':{$in : ids}},function(err,result) {
console.log(result);
});
});
答案 1 :(得分:1)
您可以简单地使用聚合来分组和填充集合。 现在我们有了想要的结果
db.<your collection name>.aggregate([
{
$match: {<match your fields here>}
},
{
$group: {_id: <your field to group the collection>}
},
{
$lookup: {
from: "<your collection of the poupulated field or referenced field>",
localField: "<give the id of the field which yout want to populate from the collection you matched above cases>",
foreignField: "_id", //this references the id of the document to match the localField id in the from collection
as: 'arrayName', //<some name to the returned document, this is a single document array>
}
},
{
$project: {
//you really don't want the whole populated fields, you can select the fields you want
<field name>:
<1 or 0>, // 1 to select and 0 to not select
//you can add multiple fields here
//to select the fields that just returned from the last stage we can use
"arrayName._id": <1 or 0>,
}
}
])
//at last you can return the data
.then((data) =>{
console.log(data);
});
我们有 distinct()
的 $group
和
populate()
by $lookup
我们还 select()
by $project