【问题标题】:MongoError: Unknown modifier: $pushAll in node jsMongoError:未知修饰符:节点js中的$pushAll
【发布时间】:2018-07-14 10:39:50
【问题描述】:

我在保存模型失败时遇到问题 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() 

系统信息如下:

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

请帮我整理一下。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

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

    您可以执行以下操作:

    【讨论】:

    【解决方案2】:

    如果有任何新人偶然发现此问题,从 mongoose 5xx 开始,架构定义中对 usePushEach: true 选项的支持已被删除

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

    【讨论】:

      【解决方案3】:

      如果您使用 > 3.6 则无法正常工作。 但如果你想让它工作,你可以使用$push$each 它会工作。

      【讨论】:

        【解决方案4】:

        使用以下代码添加到上述答案中,以使您清楚地实现 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。

        谢谢。

        【讨论】:

        • 在我看来,这是最好的解决方案,因为从长远来看,“降级到 3.4”是不可能的,“usePushEach: true”似乎就像“拜托,我想继续使用这段已弃用的代码”。如果不推荐使用“push”,让我们使用 concat 并继续使用它。
        【解决方案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'
            }] });
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            试试

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

            这对我有用

            【讨论】:

              【解决方案8】:

              使用 concat 解决问题

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

              【讨论】:

              • Domain.subDomains.push({'name': 'default' , 'role': 'xyz', ...}) --> Domain.subDomains = Domain.subDomains.concat([{'name': 'default' , 'role': 'xyz'}])
              【解决方案9】:

              将 .push() 替换为 .unshift()

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-10-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-12-24
                • 1970-01-01
                • 2014-05-06
                • 2021-11-11
                相关资源
                最近更新 更多