我有下一个文档,我想更新 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/