NodeJS 在一次操作中使用多个addToSet不适用于多个数组

cl25kdpy  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(123)

我有一个包含以下字段的文档:

...
    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

lb3vh1jj

lb3vh1jj1#

您遇到的问题是由于update对象中$addToSet操作的结构方式造成的。在JavaScript中,当您定义一个对象时,如果多个属性具有相同的键,则最后一个属性将覆盖所有具有相同键的先前属性。这就是为什么只设置firebaseInstallationIds;它是对象中的最后一个$addToSet操作。
要解决这个问题,您需要将所有$addToSet操作合并到一个对象中。
下面是工作示例:

let user = {
    _id: userId,
    $set: { [`firebaseTokens.${deviceId}`]: token },
    $addToSet: {
        androidIds: deviceId,
        advertisingIds: advertisingId,
        firebaseInstallationIds: firebaseInstallationId
    }
}
let options = { new: true, setDefaultsOnInsert: true };
let userDoc = await UserModel.findByIdAndUpdate(user._id, user, options);

字符串

相关问题