将嵌套的String值复制到mongodb中的新嵌套对象

时间:2019-10-12 20:28:37

标签: mongodb mongoose

我最初创建了一个字符串refillNote,最近我决定将其转换为对象数组refillNotes(请参见下文)。因此,我需要将每个用户的refillNote字符串(来自对象refills的字符串)的字符串值复制到新对象中。

由于两个项目都嵌套在不同的层中,因此我无法使用$set方法获取字符串数据并将其注入到嵌套对象中。

这是User对象:

{ 
   name:"Joe",
   refills: [ 
      { 
         refillNote: "original refill note",
         refillNotes: [
            { 
               note:"I need to copy the original refillNote here",
               username:"Tim"
            }
         ]
      }
   ]
}

我只是想从笔芯数组中获取现有的refillNote字符串值,并创建一个新的refillNotes对象并将其注入到数组中,如上所示。

这是我用来将新对象添加到refillNotes数组的当前代码,但是问题是,我无法采用refillNote值并在此处进行设置:

User.updateMany(
  {},
  {
    $set: {
      "refills.$.refillNotes": [
        { username: "Joe", note: "refills.$.refillNote" }
      ]
    }
  }
);

这当前将注释添加为文字字符串“ refills。$。refillNote”,因此我无法确定在此序列中我将能够提取原始refillNote值并能够再次使用它在此$set方法中。任何输入将不胜感激。

修改

最终使用了一个老旧的forEach解决方案(如下所示),我回避了这个问题,但是如果有人遇到过基于聚合器的mongodb解决方案(或缺少该解决方案)的话,那就太棒了。

  User.find({})
    .then(function(results) {
      return results.map(function(user) {
        user.refills.forEach(function(refill) {
          if (refill.refillNote) {
            refill.refillNotes = [
              { username: "Tim", note: refill.refillNote }
            ];
          } else {
            refill.refillNotes = [];
          }
        });
        return user.save();
      });
    })

1 个答案:

答案 0 :(得分:0)

您需要使用$map应用于每个数组元素。 这就是您需要的:

db.collection.aggregate([
  {
    "$addFields": {
      "refills": {
        "$map": {
          input: "$refills",
          as: "refill",
          in: {
            refillNote: "$$refill.refillNote",
            refillNotes: [
              {
                "refillNote": "$$refill.refillNote",
                name: "Tim"
              }
            ]
          }
        }
      }
    }
  }, 
  {$out:'collection'}
])

会写:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "Joe",
    "refills": [
      {
        "refillNote": "original refill note",
        "refillNotes": [
          {
            "name": "Tim",
            "refillNote": "original refill note"
          }
        ]
      }
    ]
  }
]

如果您的refills.refillNotesd不必是数组(因为它已经位于'refills'数组中),只需删除上述聚集中的array元素:

...
            refillNotes: {
                "refillNote": "$$refill.refillNote",
                name: "Tim"
              }
           } 
...