首页 > 解决方案 > 如何在mongodb中用ObjectIds数组替换字符串数组

问题描述

我有两个表,titlesmembers想引用titleinside的 id member

我的数据库结构如下所示:

// 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}});
          }
        }
      })
    }
  })
}

它运行它,但它没有错误,但它没有进行任何更改。

标签: mongodbmongoose

解决方案


试试这个方法

 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

更新数组中的值 ( <array>.$)


推荐阅读