node.js - MongoDB 更新子文档更改其_id

标签 node.js mongodb mongoose

我有下一个文档,我想更新 ID 为 21 的地址,将别名更改为“Family”。我运行 User.update({ _id: 2, 'addresses._id': 21 }, { 'addresses.$': newAddress });

效果很好,但有一个恼人的副作用,那就是 Mongo 会为子文档生成一个新的 ID。有没有办法在不获取新 ID 的情况下更新子文档?

'user': {
  '_id': 2,
  'addresses': [
    {
      '_id': '20',
      'alias': 'Work',
      'postal_code': 1235
    },
    {
      '_id': '21',
      'alias': 'Home',
      'postal_code': 1235
    }
  ]
}

我已经用

解决了这个问题
User.update(
  { _id: req.user._id, 'addresses._id': addressId },
  { $set: {
    'addresses.$.alias': newAddress.alias,
    'addresses.$.address': newAddress.address,
    'addresses.$.areaId': newAddress.areaId,
    'addresses.$.cityId': newAddress.cityId,
    'addresses.$.postal_code': newAddress.postal_code
  } }
);

这不会更改子文档的 ID,但出于显而易见的原因,我不喜欢这种解决方案。

最佳答案

添加到 JasonCust 的答案中,正确的方法是将旧 ID 注入(inject)新地址以保持 ID 不变并避免输入每个单独的 key 。

下面是一个例子:

  const userSchema = new Schema({
    addresses: [{ country: String }]
  });

  const User = mongoose.model('User', userSchema);
  const user = await User.create({
    addresses: [
      { country: 'Egypt' }
    ]
  });

  const oldAddressId = user.addresses[0]._id;

  //
  const newAddress = {
    _id: oldAddressId,
    country: 'Japan'
  };

  await User.updateOne({ 'addresses._id': oldAddressId }, { 'addresses.$': newAddress });
  const userAfterUpdate = await User.findOne({ _id: user._id });

  assert.equal(userAfterUpdate.addresses[0].country, 'Japan');
  assert.equal(userAfterUpdate.addresses[0]._id.toString(), oldAddressId.toString());

关于node.js - MongoDB 更新子文档更改其_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48490762/

相关文章:

node.js - 如何使用express js和sequelize将csv文件导入mysql数据库

java - MongoDB 3.2 Java 驱动程序 : How To Use AggregateOperation

javascript - 如何使用 mongoose 中的用户对象 id 数组返回文档数组?

javascript - 如何在一次查询中使用 .skip()、.limit() 和总匹配结果进行 MongoDB 文本搜索?

ruby - 为什么这个 CoffeeScript 比这个 Ruby 脚本快?

javascript - node.js 日志模块 bunyan 更改时区

node.js - 无法访问 View

node.js - mongoDb:按距离选择所有用户

java - 如何返回收到的mongodb数据?

mongodb - Node + Mongoose : Get last inserted ID?