MongoError:未知修饰符:节点js中的$ pushAll

San*_*nde 16 javascript mongoose mongodb node.js

我在保存模型失败时出现问题mongo错误:MongoError:Unknown modifier:$ pushAll.

我的subDomains架构中有一个数组字段,它将作为默认值保存在子域中,如下所示.

 // already Domain instance get availble 
 Domain.subDomains.push({'name': 'default' , 'role': 'xyz', ...});

 // save domain with default fileds
 Domain.save() 
Run Code Online (Sandbox Code Playgroud)

系统信息如下:

         ?  ~ node --version
          v9.4.0
          ?  ~ npm --version
          5.6.0
          ?  ~ 
          ?  ~ mongo --version
            MongoDB shell version v3.6.2
            git version: ......
            OpenSSL version: OpenSSL 1.0.2n  7 Dec 2017
            allocator: system
            modules: none
            build environment:
                distarch: x86_64
                target_arch: x86_64
          ?  ~ 
Run Code Online (Sandbox Code Playgroud)

请帮我梳理一下.

Teo*_*tev 28

$pushAllMongo 3.6.2(或3.6.x +中的任何较新版本)不再支持该运算符.

您可以执行以下操作:

  • 少量添加;您可能需要多次降级。即从 4.0 到 3.6,然后是 3.6 到 3.4,运行 `db.adminCommand({setFeatureCompatibilityVersion: "3.6"})` 等。信息在这里:https://docs.mongodb.com/manual/release-notes/4.0-downgrade -独立/ (2认同)

Bal*_*i M 15

使用以下代码添加上述答案,以使您清楚地实现concat方法.您不需要特别降级MongoDB.

在解决此问题之前,您需要记住$ pushAll方法已被弃用了很长时间,所以他们可能会在3.5及更高版本中将其删除.

但您可以使用另一种替代方法- concat方法解决此问题.

我的旧代码,

myArray.push(id); //breaks on DocumentDB with Mongo API because of $pushAll
Run Code Online (Sandbox Code Playgroud)

已被取代,

myArray = myArray.concat([id]); //this uses $set so no problems
Run Code Online (Sandbox Code Playgroud)

甚至Azure自己的MongoDB实现也不支持$ pushAll.

谢谢.

  • 在我看来,这是最好的解决方案,因为从长远来看,"降级到3.4"是不可能的,"usePushEach:true"似乎就像"请取悦我想继续使用这个已弃用的代码".如果不推荐使用"push",那么让我们使用concat并继续使用它. (3认同)

Nna*_*ugo 9

如果有任何新的绊倒,从mongoose 5xx,usePushEach: true删除了对模式定义中的选项的支持

您应该concat()在附加对象时使用通常使用push的位置.如果concat()不起作用(示例$inc显式或隐式调用),请使用unshift().


小智 7

更换.push.unshift是处理这个错误的最好方式。我希望这可以拯救你的一天。


小智 6

我正在使用“猫鼬”:“ ^ 4.12.1”,。push的使用引发了相同的错误。usePushEach为我使用作品。我们可以为所有这样的模式打开它:

const mongoose = require('mongoose');
mongoose.plugin(schema => { schema.options.usePushEach = true });
const Schema = mongoose.Schema; 
const SampleSchema = new Schema({
    attr1: type,
    attr2: type,
    attr2: type,
    attr4: [{
        type: Schema.Types.ObjectId,
        ref: 'ref_table_name'
    }] });
Run Code Online (Sandbox Code Playgroud)