Mongodb 获取mongoose架构数组字段findOne中的计数
我想使用Mongoose返回有关用户的信息,以填充他们的配置文件。我一直在使用findOne通过嵌入文档和.populate来填充他们的评论列表以及基本的概要信息。我想通过计算friends数组中有多少个对象来计算他们拥有的朋友数 看起来聚合就是其中之一,但是我怎么能同时使用这两者呢?或者在findOne查询中是否有一种简单的计数方法Mongodb 获取mongoose架构数组字段findOne中的计数,mongodb,express,mongoose,mongoose-schema,Mongodb,Express,Mongoose,Mongoose Schema,我想使用Mongoose返回有关用户的信息,以填充他们的配置文件。我一直在使用findOne通过嵌入文档和.populate来填充他们的评论列表以及基本的概要信息。我想通过计算friends数组中有多少个对象来计算他们拥有的朋友数 看起来聚合就是其中之一,但是我怎么能同时使用这两者呢?或者在findOne查询中是否有一种简单的计数方法 var UserSchema=新模式({ 用户名:String, 注释:[{type:Schema.Types.ObjectId,ref:'Comment'}]
var UserSchema=新模式({
用户名:String,
注释:[{type:Schema.Types.ObjectId,ref:'Comment'}],
朋友们:[
{
id:{type:Schema.Types.ObjectId,ref:'User'},
权限:号码
}
]
})
var User=mongoose.model('User',UserSchema);
var Comment=mongoose.model('Comment',CommentSchema);
app.get('/profile/:username',函数(req,res){
使用者
.findOne({username:req.params.username},'username friends-_id')
.填充({
路径:“当前”,
模型:“注释”,
选择:“评论作者-_iddate”,
填充:{
路径:'作者',
模型:“用户”,
选择:“用户名firstName lastName-\u id”
}
})
.exec(函数(错误,用户){
//
})
)}
如果用户返回的是好友数组,为什么不只返回user.friends.length
如果你想数数,就用这个
User.aggregate([
{
$match: { username: req.params.username }
},
{
$unwind: "$comments"
},
{
$lookup: {
from: "Comment",
localField: "comments",
foreignField: "_id",
as: "comments"
}
},
{
"$group": {
"_id": "$_id",
"friends": { "$first": "$friends"},
"comments": { "$push": "$comments" }
}
},
{
$project: {
_id: 0,
count: {$size: '$friends'},
comments: 1,
username: 1
}
}
]).exec() ...
因为当我需要计数时,如果他们有很多实体,我会返回一个巨大的数组。如果我已经在使用findOne with.populate来嵌入文档呢?我可以用聚合来做同样的事情吗?或者我可以将它们组合在一起吗?嗯,您不能将填充方法与聚合一起使用。相反,您必须使用lookup方法来获取comments对象。我更新了我的答案。在文档上搜索查找、展开和分组:。另外,我查看了您编辑的答案。看起来您可能不需要聚合。只要您不填充friends集合,它就会返回对象Id列表的数组,这是正常的。您可以返回该长度。如果您仍然不想返回对象id列表,则必须使用聚合,因为我可以测试您的集合(无论是查看还是所有架构),因此可能需要更多时间来构建聚合。为什么不使用user.friends.length?