【问题标题】:Save length of array in extra MongoDB field [duplicate]在额外的MongoDB字段中保存数组的长度[重复]
【发布时间】:2017-07-13 13:43:44
【问题描述】:

根据this的回答,我正在尝试找出数组的大小并将其保存在额外的字段中。

我有一个集合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

【问题讨论】:

标签: mongodb mongodb-query


【解决方案1】:

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

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

将返回的likes_count 存储在variable 中,并通过提供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);
        })
    }
)

【讨论】:

    【解决方案2】:

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

    如果 $out 操作指定的集合已经存在,那么在聚合完成后,$out 阶段会自动将现有集合替换为新的集合结果收集。

    要获取计数,请使用返回数组字段长度的 $size 运算符。 请记住,所有文档都必须包含 likes 字段。

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

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

    【讨论】:

    猜你喜欢
    • 2015-10-17
    • 2020-05-04
    • 2019-08-23
    • 2021-07-12
    • 2015-03-16
    • 1970-01-01
    • 2019-08-30
    • 2022-08-14
    • 1970-01-01
    相关资源
    最近更新 更多