【问题标题】:MongoError: Unknown modifier $pushAll when I try to push an userId into an Array field in Node.jsMongoError:当我尝试将 userId 推送到 Node.js 中的数组字段时,未知修饰符 $pushAll
【发布时间】:2018-10-31 11:26:23
【问题描述】:

当我尝试将 userId 推送到 Array of likes 字段时,我收到了 MongoError: Unknown modifier $pushAl 错误:

【问题讨论】:

  • 您能提供您尝试使用的代码吗?
  • 修复它!刚刚在架构中添加了 {usePushEach:true} 并喜欢新的 mongoose.Schema({props}, {usePushEach: true});

标签: javascript node.js mongodb mongoose mongodb-query


【解决方案1】:

$pushAll 自版本 2.4 起已被弃用:

自 2.4 版起已弃用:将 $push 运算符与 $each 一起使用。

您可以/应该使用您正在使用的 MongoDB 版本升级到 compatible 的更新版 Mongoose,或者将 MongoDB 降级到仍然支持 $pushAll 的旧版本。我会建议前者。

或者,如果您使用的是 Mongoose 版本 < 5,则可以在定义架构时使用 usePushEach: true 选项:

new mongoose.Schema({ ... }, {
    usePushEach: true,
});

您可以在GitHub 上阅读有关该问题的更多信息:

vkarpov15 于 2017 年 9 月 26 日发表评论

这是一个问题,MongoDB 3.5 是一个不稳定的开发版本,不应该使用。 $pushAll 已被弃用很长时间,所以也许他们在 3.5 中摆脱了它。 @mbroadst你能澄清一下吗?

我们添加了一个 usePushEach 选项来解决这个问题:#4455,这应该是解决这个问题的方法:

new Schema({ arr: [String] }, { usePushEach: true });

Mongoose version >= 5 已放弃对 usePushEach 的支持,因此在这种情况下,您可以改用 Array.prototype.concat(),因此您的旧代码:

selectedHotel.likes.push(userId);

会变成:

selectedHotel.likes = selectedHotel.likes.concat([userId]);

请注意,我将concat 返回的值分配回selectedHotel.likes,因为concat 不会改变原始数组。

【讨论】:

    【解决方案2】:

    试试这个

    selectedHotel._doc.likes.push({//anything})
    

    或 这 我的旧代码,

    myArray.push(id); //breaks on DocumentDB with Mongo API because of $pushAll
    

    已被替换为,

    myArray = myArray.concat([id]);
    

    【讨论】:

      【解决方案3】:

      我通过更新到最新版本的 mongoose 解决了这个问题。我在使用 4.6 版时遇到了同样的问题,我做了npm uninstall mongoose,然后是npm i mongoose,它安装了 5.11.18 版,这是撰写本文时的最新版本,问题得到了解决。 这对我来说是一个非常简单的解决方案,无需更改我的代码中的任何内容,它加起来就是上面所说的。

      【讨论】:

        猜你喜欢
        • 2018-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多