Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 获取mongoose架构数组字段findOne中的计数_Mongodb_Express_Mongoose_Mongoose Schema - Fatal编程技术网

Mongodb 获取mongoose架构数组字段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'}]

我想使用Mongoose返回有关用户的信息,以填充他们的配置文件。我一直在使用findOne通过嵌入文档和.populate来填充他们的评论列表以及基本的概要信息。我想通过计算friends数组中有多少个对象来计算他们拥有的朋友数

看起来聚合就是其中之一,但是我怎么能同时使用这两者呢?或者在findOne查询中是否有一种简单的计数方法

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?