2017-02-23 75 views
2

根据this的答案,我试图找出数组的大小并将其保存在额外的字段中。在mongodb中查找数组的长度

我有一个集合user_details和文档结构是这样的:

{ 
    user_id : 1, 
    likes : [1,2,3,4], 
    likes_count : 0 
} 

我使用的查询如下:

db.user_details.update({user_id : 1},{$set:{ likes_count : this.likes.length }}) 

,但它会引发错误

"message" : "Cannot read property 'length' of undefined" 

如何在额外的字段中保存数组的长度?

PS:我使用MongoDB的3.4

回答

1

https://docs.mongodb.com/manual/reference/operator/aggregation/size/#exp._S_size

db.users.aggregate(
    [ 
     { 
     $project: { 
      likes_count: { $size: "$test" } 
     } 
     } 
    ] 
) 

店在variable返回likes_count并通过提供likes_count变量

像这样

Model.aggregate(
    [ 
     { 
      $project: { 
       likes_count: { $size: "$test" } 
      } 
     } 
    ], (err, re) => { 
     console.log(err, re); 
     var likes_count = re[0].likes_count; 
     Model.update({email: 1}, {$set: {likes_count: likes_count}}, (err, d) => { 
      console.log(err, d); 
     }) 
    } 
) 
执行更新
1

随着MongoDB的3.4及更高版本,可以使用$addFields管道添加所需的字段($addFields阶段相当于$project阶段明确指定在输入文档中的所有现有的领域,并增加了新的领域)和然后使用$out运算符将聚合操作的结果写入同一个集合,从而有效地更新基础集合。

如果由$out操作所指定的收集已经存在,则聚集的完成后,$out阶段原子与新结果集替换现有的集合。

要获得计数,请使用$size运算符,该运算符返回数组字段的长度。总体而言,您需要运行以下管道以实现所需的更新操作:

db.user_details.aggregate([ 
    { "$addFields": { "likes_count": { "$size": "$likes" } } }, 
    { "$out": "user_details" } 
])