首页 > 解决方案 > 使用 db.someDb.update([]) 时,如何在不创建对象的情况下在 Mongodb 中 $set 数组?

问题描述

我见过类似的问题要更新和设置,但似乎没有一个能解决我在说的问题。假设您有带有以下文档的 antsDb

{ "name": "ant1", "antId": 1, "colId": "colony1" }
{ "name": "ant2", "antId": 2, "colId": "colony1" }
{ "name": "ant3", "antId": 3, "colId": "colony2" }

你有colonyDb

{ "colId": "colony1", "jobsArray": ["findFood", "workHard", "carryFood", "feedQueen"] }
{ "colId": "colony2", "jobsArray": ["childCare", "cutLeaves", "feedQueen"] }

我想更新每只蚂蚁,以便它们拥有各自殖民地的 jobsArray。但是当我为蚂蚁设置 jobsArray 时,我不想创建一个对象。我以为我可以把

db.colonyDb.aggregate([]).forEach(function(col) {
   db.antsDb.update([
      {
         "colId": col.colId
      },
      {
         $set: {
            "myAntJobs": col.jobsArray
         }
      }
   ])
})

这将在每个不存在的匹配 ant 文档上设置一个名为 myAntJobs 的数组,从而导致

{ "name": "ant1", "antId": 1, "colId": "colony1", "myAntJobs": ["findFood", "workHard", "carryFood", "feedQueen"] }
{ "name": "ant2", "antId": 2, "colId": "colony1", "myAntJobs": ["findFood", "workHard", "carryFood", "feedQueen"] }
{ "name": "ant3", "antId": 3, "colId": "colony2", "myAntJobs": ["childCare", "cutLeaves", "feedQueen"] }

但我得到E QUERY [js] 错误:需要一个对象。我猜它想让我放一些类似的东西:

$set: {
   "myAntJobs": {
      "myJobs": col.jobsArray
   }
}

这不会把蚂蚁身上的所有数组都变成一个字段的对象吗?还是我想错了……最大的问题是我真的没有测试的空间(尽管我花了很多精力来提出这个问题,但我可能会使用我刚刚输入的内容,哈哈)。

有人可以在功能上解释 $set 在这种情况下是如何工作的吗?此外,如果您知道一种更有效地将数组添加到 forEach 中的结果文档的更好方法,请告诉我。但我想首先在这种情况下理解 $set 。

标签: arraysmongodbsetaggregate

解决方案


推荐阅读