我有一个包含以下字段的文档:
...
firebaseTokens: { type: Map, of: String },
androidIds: [{ type: String, maxlength: 128 }],
advertisingIds: [{ type: String, maxlength: 128 }],
firebaseInstallationIds: [{ type: String, maxlength: 128 }],
...
字符串
当我想在一次操作中同时使用$AddToSet
设置所有三个数组时,只设置最后一个数组。
let user = {
_id: userId,
$set: { [`firebaseTokens.${deviceId}`]: token, },
$addToSet: { androidIds: deviceId },
$addToSet: { advertisingIds: advertisingId },
$addToSet: { firebaseInstallationIds: firebaseInstallationId }
}
let options = { new: true, setDefaultsOnInsert: true };
let userDoc = await UserModel.findByIdAndUpdate(user._id, user, options);
型
在上面的代码中,只设置了firebaseInstallationIds
。
1条答案
按热度按时间lb3vh1jj1#
您遇到的问题是由于update对象中
$addToSet
操作的结构方式造成的。在JavaScript中,当您定义一个对象时,如果多个属性具有相同的键,则最后一个属性将覆盖所有具有相同键的先前属性。这就是为什么只设置firebaseInstallationIds
;它是对象中的最后一个$addToSet
操作。要解决这个问题,您需要将所有
$addToSet
操作合并到一个对象中。下面是工作示例:
字符串