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

    ...
    firebaseTokens: { type: Map, of: String },
    androidIds: [{ type: String, maxlength: 128 }],
    advertisingIds: [{ type: String, maxlength: 128 }],
    firebaseInstallationIds: [{ type: String, maxlength: 128 }],
    ...

当我想在一次操作中同时使用$AddToSet设置所有三个数组时,只设置最后一个array.

 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.

推荐答案

您遇到的问题是由于UPDATE对象中$addToSet个操作的 struct 方式造成的.在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);

Javascript相关问答推荐

JS生成具有给定数字和幻灯片计数的数组子集

ReactJS中的material UI自动完成类别

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

zoom svg以适应圆

按下同意按钮与 puppeteer 师

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

Next.js(react)使用moment或不使用日期和时间格式

在观察框架中搜索CSV数据

如何将Map字符串,布尔值转换为{key:string;value:bo布尔值;}[]?<>

Promise Chain中的第二个useState不更新

加载背景图像时同步旋转不显示的问题

您能在卸载程序(QtInsteller框架)上添加WizardPage吗?

顶点图使用组标签更新列之间的条宽

为什么NULL不能在构造函数的.Prototype中工作

如何让SVG图标在被点击和访问后改变 colored颜色 ,并在被访问后取消点击时恢复到原来的 colored颜色 ?

通过解构/功能组件接收props-prop验证中缺少错误"

从异步操作返回对象

通过ng-绑定-html使用插入的HTML中的函数

如何在底部重叠多个div?

如何在不获取其子元素的文本内容的情况下获取元素的文本内容?