数组上的updateMany()

时间:2020-08-11 16:20:00

标签: javascript mongodb mongoose

在我的应用程序中,我有一个名为Blog的集合,并且每24小时运行一次此查询

  await Blog.updateMany({}, [
    {
      $set: {
        viewed: {
          $add: [{ $size: "$visitorIps" }, "$viewed"]
        },
        visitorIps: []
      }
    }
  ]);

我的问题是我有另一个名为Users的收藏集。 在用户内部,我有一个名为posts的数组,这是该用户保存的所有帖子。

{
   _id: 234klj2ö34,
   user: "Max",
   posts: [
      {
         _id: 5dgewef323523,
         name: "My first blogpost",
         content: "...",
         viewed: 0,
         visitorIps: ["192.168.23.12"]
      }
   ]
}

现在我需要在每个数组的第二个集合上进行相同的查询。我该怎么做?我尝试了类似的方法,但是没有用:

  await User.updateMany({}, [
    {
      $set: {
        "posts.$[].viewed: {
          $add: [{ $size: "posts.$[].visitorIps" }, "posts.$[].viewed"]
        },
        "posts.$[].visitorIps": []
      }
    }
  ]);

但是那完全是错误的。有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

您可以尝试使用$map

  • 对于viewedvisitorIps,您的逻辑和代码保持不变
  • $mergeObjects将合并当前的光标字段以及我们计算出的viewedvisitorIps
await User.updateMany({},
    [{
        $set: {
            posts: {
                $map: {
                    input: "$posts",
                    as: "post",
                    in: {
                        $mergeObjects: [
                            "$$post",
                            {
                                "viewed": {
                                    $add: [{ $size: "$$post.visitorIps" }, "$$post.viewed"]
                                },
                                "visitorIps": []
                            }
                        ]
                    }
                }
            }
        }
    }]
)