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

时间:2018-02-04 12:12:56

标签: javascript node.js mongodb mongoose

我在使用 mongo错误保存模型失败时出现问题:MongoError:未知修饰符:$ pushAll

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

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

 // save domain with default fileds
 Domain.save() 

系统信息如下:

         ➜  ~ 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
          ➜  ~ 

请帮我梳理一下。

9 个答案:

答案 0 :(得分:22)

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

您可以执行以下操作:

答案 1 :(得分:14)

使用以下代码添加上述答案,以明确实施 concat 方法。你不需要特别降级MongoDB。

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

但您可以使用其他替代方法解决此问题 - concat 方法。

我的旧代码,

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

已被替换为,

myArray = myArray.concat([id]); //this uses $set so no problems

即使Azure’s own MongoDB implementation也不支持$ pushAll。

谢谢。

答案 2 :(得分:6)

如果有任何新用户在此mongoose 5xx发现错误,则会删除对架构定义中usePushEach: true选项的支持

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

答案 3 :(得分:5)

我正在使用“mongoose”:“^ 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'
    }] });

答案 4 :(得分:1)

如果您使用> 3.6它不工作。 但是如果你能让它发挥作用,你可以使用$push以及$each来工作。

答案 5 :(得分:1)

.push替换.unshift是解决此错误的最佳方法。 我希望这可以节省您的时间。

答案 6 :(得分:1)

用 .unshift() 替换 .push()

答案 7 :(得分:0)

尝试

Domain._doc.subDomains.push({'name': 'default' , 'role': 'xyz', ...});

这对我有用

答案 8 :(得分:0)

使用concat解决问题

 var newArray=  Domain.subDomains.concat([{'name': 'default' , 'role': 'xyz'}]) 
      Domain.subDomains=newArray
      Domain.save()