如何在mongodb中用ObjectIds数组替换字符串数组

时间:2019-10-22 02:26:14

标签: mongodb mongoose

我有两个表titlesmembers,我想在title内引用member的ID。

我的数据库结构如下:

// collection titles
  {
    "_id": ObjectId("5dd5brf45d1320b01edc1432"),
    "name": "mother"
  }
  {
  "_id": ObjectId("3dw5brf45t3320b01edc2864"),
  "name": "wife"
  }

// collection members
  {
  "_id": ObjectId("5rd7tjh23t5786k42edf9753"),
  "firstName": "Mary",
  "familyTitles": ["mother", "wife"]
  }

但是我想替换为

// collection members
{
"_id": ObjectId("5rd7tjh23t5786k42edf9753"),
"firstName": "Mary",
"familyTitles": [ObjectId("5dd5brf45d1320b01edc1432"), ObjectId("3dw5brf45t3320b01edc2864")]
}

这是我尝试过的脚本:

db.members.find({}).forEach((member) => {
  member.familyTitles.forEach((familyTitle, i) => {
    var titleId = db.titles.findOne({name: familyTitle});
    member.familyTitles[i].update({$set: {i: titleId._id}})
  })
})

但是出现以下错误:TypeError: member.familyTitles is undefined

---编辑1 ---

我尝试如下修改脚本:

var members = db.members.find({});

if (members) {
  members.forEach((member) => {
    if (member.familyTitles) {
      member.familyTitles.forEach((familyTitle, i) => {
        if (familyTitle) {
          var titleId = db.titles.findOne({name: familyTitle});
            db.members.update({_id: member._id}, {$set: {"familyTitles.$": titleId._id}});
          }
        }
      })
    }
  })
}

它可以运行它,但是没有错误,但是没有任何改变。

1 个答案:

答案 0 :(得分:2)

尝试这种方式

 db.titles.findOne({name: familyTitle}).then(title => {
        db.members.update({_id: member._id,familyTitles:title.name }, {$set: {"familyTitles.$": title._id}});
  }

findOne-这是async方法,因此您可以使用then方法获取结果,也可以使用await(async_await.js)运算符获取结果一旦操作完成。

familyTitles:title.name-您必须为查询中要更新的数组值指定完全匹配的值。

引荐链接:

mongodb-javascript

Update Values in an Array (<array>.$)