Mongoose: 保存模型失败并出现 mongo 错误:MongoError: Unknown modifier: $pushAll

创建于 2017-08-23  ·  27评论  ·  资料来源: Automattic/mongoose

您要请求功能还是报告错误

报告错误

目前的行为是什么?

测试在本地机器上通过但在具有完全相同版本的 jenkins 服务器上失败。 据我所知,唯一的区别是本地是 macos,而 jenkins 是 ubuntu。

在 MacOS Sierra、节点 8.4 和 7.11、mongodb 3.4.7 和 mongoose 4.11.7 上,以下测试通过,但在我们的 jenkins 服务器上,在 ubuntu 16.04 服务器上使用完全相同的版本失败。

  it("should successfully allow an alias that matches a service", async () => {
    const aliasTag = "this is a test";
    const appAlias = await AliasController.create(user, appAliasSpec);
    const serviceAlias = await AliasController.create(user, serviceAliasSpec);

    appAlias.aliases.push(aliasTag);
    await appAlias.save(); // This is the line that fails in jenkins

    serviceAlias.aliases.push(aliasTag);
    await serviceAlias.save();

    const confAppAlias = await AliasController.getById(appAlias._id);
    const confServiceAlias = await AliasController.getById(serviceAlias._id);
    expect(confAppAlias.aliases[1]).to.equal(aliasTag);
    expect(confServiceAlias.aliases[1]).to.equal(aliasTag);
  });

这是我得到的确切错误:

{
    "message": "Unknown modifier: $pushAll",
    "name": "MongoError",
    "stack": "MongoError: Unknown modifier: $pushAll\n    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)\n    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)\n    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67\n    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18\n    at _combinedTickCallback (internal/process/next_tick.js:131:7)\n    at process._tickCallback (internal/process/next_tick.js:180:9)",
    "code": 9
}

编辑:这是堆栈跟踪的更具可读性的版本

MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
needs clarification

最有用的评论

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

我们添加了一个usePushEach选项来解决这个问题: https :

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

所有27条评论

你能做mongoose.set('debug', true)并粘贴 mongo 输出吗?

编辑:更清晰的输出

Mongoose: aliases.update({ _id: ObjectId("599d98122b72d12e0ba858b4") }, { '$pushAll': { aliases: [ 'this is a test' ] }, '$set': { updatedAt: new Date("Wed, 23 Aug 2017 14:58:26 GMT") }, '$inc': { __v: 1 } })
{"name":"davis","hostname":"ld-ub-bm980a98v","pid":11787,"level":50,"err":{"message":"Unknown modifier: $pushAll","name":"MongoError","stack":"MongoError: Unknown modifier: $pushAll
    at Function.MongoError.create (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/error.js:31:11)
    at toError (/var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/utils.js:139:22)
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb/lib/collection.js:1060:67
    at /var/lib/jenkins/workspace/davis-cloudcontrol/node_modules/mongodb-core/lib/connection/pool.js:469:18
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)","code":9},"msg":"An unhandled Mongo error occurred.","time":"2017-08-23T14:58:26.201Z","v":0}

对于它的价值,我检查了我们本地开发和生产环境中的调试输出,他们都成功地使用了 $pushAll 修饰符。 在所有情况下,Mongo 都是从官方软件包安装的。 开发机器是windows和MacOS,生产机器是amazon linux。

您可以使用 mongo shell 连接到您的 jenkins mongodb 实例并使用db.version仔细检查版本吗?

$ mongo test
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017/test
MongoDB server version: 3.4.1 
> db.version()
3.4.1
> ^C
bye

您还可以使用 mongoose 使用serverStatus()命令打印服务器版本:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/test');

mongoose.connection.on('open', function() {
  mongoose.connection.db.admin().serverStatus(function(error, info) {
    console.log(info.version);
  });
});

请先仔细检查您的版本,官方软件包往往很快就会过时。

是的,有同样的错误。 尝试从 3.2 移动到 3.5(无数据迁移)。 我有一个数组字段

    'liked': {
        'item':[ {
            'id': {'type': Types.ObjectId, 'ref': 'Item'},
            'score': {'type': Number, 'max': 100, 'default': -1},
            'comment': {'type': String, 'maxlength': 65000, 'trim': true, 'default': '', 'set': san.methods.safe}
        } ]
    },

我知道, id不是最好的字段名称,但是嘿,它在 3.2 中有效。 在 3.5 中,在将 Item 推入数组后尝试.save()文档后失败。 我通过.push()推送项目,然后标记字段.markModified('liked.item'); 。 应该很简单。

MongoDB 3.5?

是的

 targetMinOS: Windows 7/Windows Server 2008 R2
 db version v3.5.13
 git version: 52bbaa007cd84631d6da811d9a05b59f2dfad4f3
 OpenSSL version: OpenSSL 1.0.1u-fips  22 Sep 2016
 allocator: tcmalloc
 modules: none
 build environment:
     distmod: 2008plus-ssl
     distarch: x86_64
     target_arch: x86_64

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

我们添加了一个usePushEach选项来解决这个问题: https :

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

@vkarpov15是的,它已以featureCompatibilityVersion=3.6被移除

摸。 在这种情况下,我们将确保将#5670 排除在外。

我在 ubuntu 上使用 mongodb v3.6 时遇到了同样的问题。 如果从数据库中删除了 pushAll,那么我应该如何保存实例.. 请为我提供任何替代方案

@rankitbishnoi您可以通过在选项中的每个模式定义上添加usePushEach选项来暂时解决此问题。

@vkarpov15感谢您的精彩图书馆先生。

我也遇到了 Mongoose 4.13.7 和 MongoDB 3.6.0 的这个问题。

更新:usePushEach: true到模型的模式选项解决了这个问题。

@dyladan @chaddjohnson确实有效。
多谢!

请问,我该怎么做? 如何将其添加到架构选项中? 谢谢你!

@raphaelbp12以下是使用架构选项的文档: http : //mongoosejs.com/docs/guide.html

更新架构不会更改此行为。 它不适用于 3.6 版本的数据库中的旧数据。

编辑:恢复到 3.4 版解决了这个问题。

我在我的机器上运行代码时遇到了类似的问题。 我认为是因为 Mongoose 5 和 MongoDB 3.6。 尝试恢复:

  • 猫鼬到版本 4.13.8 ( npm install [email protected] --save ),和
  • MongoDB 到 3.4(您可以检查输入db.version() )。

它对我有用! :)

Mongoose 5 不应受此问题的影响,它不会在任何地方使用$pushAll 。 如果您在使用 mongoose 5 时遇到此错误,请打开代码示例的问题:+1:

PS C:\Users\paula\projetos\apiNode\src> 节点 index.js
{ MongoError:未知修饰符:$pushAll
在 Function.MongoError.create (C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\error.js:31:11)
在 toError (C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\utils.js:139:22)
在 C:\Users\paula\projetos\apiNode\node_modules\mongodb\lib\collection.js:1059:67
在 C:\Users\paula\projetos\apiNode\node_modules\mongodb-core\lib\connection\pool.js:469:18
在 _combinedTickCallback (internal/process/next_tick.js:131:7)
在 process._tickCallback (internal/process/next_tick.js:180:9)
name: 'MongoError',
消息:'未知修饰符:$pushAll',
司机:是的,
指数:0,
代码:9

大家好,请告诉我如何修复错误未知修饰符:$ pushAll

Пробовал вот так не работает
const 猫鼬 = 要求('猫鼬')
const Схема = mongoose.Schema

const UserSchema = 新架构 ({
电报ID:{
类型:数字,
要求:真实,
usePushEach: 真
},

电影:{
类型:[字符串],
默认: []
}
})

mongoose.model ('users', UserSchema)

@rivers-lis 您必须将usePushEach到架构选项中,而不是添加到架构中,如下所示:

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

Как то вот так
const 猫鼬 = 要求('猫鼬')
const Schema = mongoose.Schema

const UserSchema = 新架构({
电报ID:{
类型:数字,
要求:真实
},

films: {
    type: [String],
    default: []
}

})

新架构({},{usePushEach:true})

mongoose.model('users', UserSchema)

new Schema({ ... }, { usePushEach: true });
这也解决了我在 4.4.12 和 5.0.7 版本上的错误

Как то вот так
const 猫鼬 = 要求('猫鼬')
const Schema = mongoose.Schema

const UserSchema = 新架构({
电报ID:{
类型:数字,
要求:真实
},

films: {
    type: [String],
    default: []
}

})

新架构({},{usePushEach:true})

mongoose.model('users', UserSchema)

抱歉看不懂俄语

@DanGDroid粗略翻译了“Как то вот так”->“类似这样的东西”

此页面是否有帮助?
0 / 5 - 0 等级