Javascript 数组上的updateMany()

Javascript 数组上的updateMany(),javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,在我的应用程序中,我有一个名为Blog的集合,我每24小时运行一次查询 await Blog.updateMany({}, [ { $set: { viewed: { $add: [{ $size: "$visitorIps" }, "$viewed"] }, visitorIps: [] } } ]); 我的问题是我有第二个集合名为Use

在我的应用程序中,我有一个名为
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": []
      }
    }
  ]);
但这是完全错误的。有人能帮我吗?

你可以试试

  • 查看的
    和访问的
    的逻辑和代码保持不变
  • 将合并当前光标字段和我们计算的
    已查看
    访问者

我怀疑这是可能的。因为,
$add,$size
是与$set aggregate update一起工作的聚合运算符。即使使用
$[]
$[element]
,也不可能将
$add、$size、$inc
用于此要求。用
$out
写另一个收藏怎么样?@Gibbs我想
$out
不是我想要的。是否可以使用聚合对此进行存档?此任务将每24小时执行一次,或每3天或4天执行一次,因此速度无关紧要。您是否确定此任务会起作用<代码>更新操作必须包含原子运算符
-是否特定于版本?请尝试在mongo shell中使用,因为有时这在另一个平台中不受支持,shell版本应为4.2。我多次遇到这种不一致的情况,但无法解释为什么在shell上成功,但不是通过3t。然而,这个解决方案看起来很有希望,mei将通过soonamazing检查它,只需复制/粘贴,它就可以毫无问题地工作
await User.updateMany({},
    [{
        $set: {
            posts: {
                $map: {
                    input: "$posts",
                    as: "post",
                    in: {
                        $mergeObjects: [
                            "$$post",
                            {
                                "viewed": {
                                    $add: [{ $size: "$$post.visitorIps" }, "$$post.viewed"]
                                },
                                "visitorIps": []
                            }
                        ]
                    }
                }
            }
        }
    }]
)