mongodb在子集数组中添加元素时出错

mongodb在子集数组中添加元素时出错,mongodb,Mongodb,我想在子集数组中添加一个元素,但它给出了一个错误。我怎样才能解决这个问题 错误: error: { "$err" : "Can't canonicalize query: BadValue Unsupported projection option: $push: { Questions: [ { _id: ObjectId('5565841ca6df1a168c4d8049'), CreationDate: new Date(1432716315502), IsActive: true

我想在子集数组中添加一个元素,但它给出了一个错误。我怎样才能解决这个问题

错误:

error: {
    "$err" : "Can't canonicalize query: BadValue Unsupported projection option: $push: { Questions: [ { _id: ObjectId('5565841ca6df1a168c4d8049'), CreationDate: new Date(1432716315502), IsActive: true, Name: \"uuu\", IsRequired: true, QuestionType: 1.0, AnswerInputType: 1.0, AnswerValidationPattern: null, AnswerValidationMessage: null, QuestionOrder: 0.0 } ] }",
    "code" : 17287
}
更新查询:

db.getCollection('forms').find({ "_id" : ObjectId("55657c94a6df1a155c779cd1") },

{
    "$push" : { 
        "Questions" : 
           [ {
            "_id" : ObjectId("5565841ca6df1a168c4d8049"), 
            "CreationDate" : ISODate("2015-05-27T08:45:16.502Z"), 
            "IsActive" : true,
            "Name" : "uuu", 
            "IsRequired" : true, 
            "QuestionType" : 1, 
            "AnswerInputType" : 1,
            "AnswerValidationPattern" : null,
            "AnswerValidationMessage" : null, 
            "QuestionOrder" : 0 
            } ]
    },
    "$inc" : { "QuestionCount" : 1 }  }

)
  • find
    方法替换为
    update
  • 使用
    $set
    而不是
    $push
    添加第一个元素(或整个问题数组,如果可能的话),它将正常工作 您只需要在创建数组后,而不是在数组为null时,推送即可将新元素添加到数组中。应该是这样的:

    db.getCollection('forms').update(
        { "_id" : ObjectId("55657c94a6df1a155c779cd2") }, 
        { "$set" : { "Questions" : [
                           {"_id":ObjectId("55659c93a6df1a22e0f93a2b"),
                            "CreationDate": ISODate("2015-05-27T10:29:39.922Z"),
                            "IsActive" : true,
                            "Name" : "ddd",
                            "IsRequired" : false,
                            "QuestionType" : 1,
                            "AnswerInputType" : 1,
                            "AnswerValidationPattern" : null,
                            "AnswerValidationMessage" : null,
                            "QuestionOrder" : 0 
                           }]
        }, 
        "$inc" : { "QuestionCount" : 1 }
      })
    
    一旦将此数组设置为上述值,它将有一个元素。然后,您可以使用
    push
    将更多元素推送到它:

    db.getCollection('forms').update(
       {"_id": ObjectId("55657c94a6df1a155c779cd2")},
       {"$push": 
          {"Questions":
             {"_id": ObjectId("55659c93a6df1a22e0f93a2d"),
              "CreationDate" : ISODate("2015-05-27T10:40:39.922Z"),
              "IsActive" : true,
              "Name" : "ccc",
              "IsRequired" : false,
              "QuestionType" : 1,
              "AnswerInputType" : 1,
              "AnswerValidationPattern" : null,
              "AnswerValidationMessage" : null,
              "QuestionOrder" : 0 } },
       "$inc" : { "QuestionCount" : 1 } } )
    

    我得到了与Ruby 2.7.1和MongoID 7.1.2完全相同的错误消息

    The field 'license_caches' must be an array but is of type null in document
    
    我可以通过检查嵌入的文档是否为空来解决此问题:

    if self.license_caches.empty?
      self.license_caches = [licenseCach]
    else 
      self.license_caches.push licenseCach
    end
    

    这对我来说是个好办法。希望这对收到相同错误消息的每个人都有帮助。

    可以,但错误已更改。错误:“问题”字段必须是数组,但文档中的类型为NULL。我使用您的代码更新了我的数据库集合。我所做的只是将
    查找
    替换为
    更新
    。你检查了开始括号和结束括号的匹配吗?我检查了括号,但没有发现任何东西。再次给出错误字段'Questions'必须是数组,但在文档{{u-id:ObjectId('55657c94a6df1a155c779cd1')}db.getCollection('forms')。update({u-id:ObjectId('55657c94a6df1a155c779cd1')},{push:'Questions':{u id:ObjectId(“55659c93a6df1a22e0f93a2b”),“CreationDate”:ISODate(“2015-05-27T10:29:39.922Z”),“IsActive”:true,“Name”:“ddd”,“IsRequired”:false,“QuestionType”:1,“AnswerInputType”:1,“AnswerValidationPattern”:null,“AnswerValidationMessage”:null,“QuestionOrder”:0},$inc:{“QuestionCount”:1})你能在这里传递db.getCollection('forms').find({“_id”:ObjectId(“55657c94a6df1a155c779cd1”)})的输出吗?我想重新生成元素,以获得实例上的确切元素并对其进行测试。