在MongoDB中使用额外的字段保存数组长度

5
根据这个回答,我正在尝试查找数组的大小并将其保存在额外字段中。
我有一个名为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


2个回答

4
使用MongoDB 3.4及以上版本,您可以使用$addFields管道来添加所需的字段($addFields阶段相当于一个$project阶段,显式指定输入文档中所有现有字段并添加新的字段),然后使用$out操作符将聚合操作结果写入同一集合,从而有效地更新底层集合。

如果$out操作指定的集合已经存在,则在聚合完成时,$out阶段原子性地用新的结果集合替换现有集合。

要获取计数,请使用$size操作符,它返回数组字段的长度。请注意,所有文档都必须具有likes字段。

总体而言,您需要运行以下管道以实现所需的更新操作:

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

2
很好提醒,所有文档必须具有likes字段。 - Dan Dascalescu

3

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

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

将返回的 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);
        })
    }
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接