推送子文档中的项目

时间:2015-06-15 08:49:56

标签: mongodb mongodb-query

我有简单的收藏。我想推送有问题的项目,但它给了一个例外。我怎么解决它?

/ * 1 * /我的收藏数据

{
    "_id" : ObjectId("557e8c93a6df1a22041e0879"),
    "QuestionCount" : 2.0000000000000000,
    "Questions" : [ 
        {
            "_id" : ObjectId("557e8c9ba6df1a22041e087a"),
            "DataSource" : [],
            "DataSourceItemCount" : NumberLong(0)
        }, 
        {
            "_id" : ObjectId("557e8c9fa6df1a22041e087b"),
            "DataSource" : [],
            "DataSourceItemCount" : NumberLong(0)
        }
    ],
    "Name" : "er"
}
  

(id = 557e8c93a6df1a22041e0879,问题ID =   557e8c9fa6df1a22041e087b)

db.getCollection('forms').update({
    "_id": ObjectId("557e8c93a6df1a22041e0879"),
    "Questions._id": ObjectId("557e8c9fa6df1a22041e087b")
}, {
    "$push": {
    "Questions.DataSource": {
        "_id": ObjectId("557e8e5ea6df1a27b403ff6b"),
        "CreationDate": ISODate("2015-06-15T08:35:42.923Z"),
        "IsActive": true,
        "Text": "op",
        "Value": "op"
    }
    }
})
  

不能使用part(Questions of Questions.DataSource)来遍历   元素({Questions:[{_ id:   ObjectId('557e8c9ba6df1a22041e087a'),CreationDate:new   日期(1434356891784),IsActive:true,名称:“uıo”,IsRequired:false,   QuestionType:1,AnswerInputType:1,AnswerValidationPattern:null,   AnswerValidationMessage:null,QuestionOrder:1,DataSource:[],   DataSourceItemCount:0},{_ id:ObjectId('557e8c9fa6df1a22041e087b'),   CreationDate:new Date(1434356895695),IsActive:true,Name:“ıu”,   IsRequired:false,QuestionType:2,AnswerInputType:1,   AnswerValidationPattern:null,AnswerValidationMessage:null,   QuestionOrder:2,DataSource:[],DataSourceItemCount:0}]})

1 个答案:

答案 0 :(得分:2)

您需要在声明的更新部分中使用positional $ operator

db.getCollection('forms').update(
    { 
        "_id" : ObjectId("557e8c93a6df1a22041e0879"),
        "Questions._id" : ObjectId("557e8c9fa6df1a22041e087b")
    },
    { 
        "$push" : { 
            "Questions.$.DataSource" : { 
                "_id" : ObjectId("557e8e5ea6df1a27b403ff6b"),
                "CreationDate" : ISODate("2015-06-15T08:35:42.923Z"), 
                "IsActive" : true, 
                "Text" : "op", 
                "Value" : "op" 
            }
        }
    }
)

它标识要更新的找到项目的索引。

虽然这对于具有嵌套数组结构的$push操作是可以的,但您很快就会发现“嵌套数组”不适合更新。这里的主要问题是“位置运算符”只能匹配“第一个”或“外部”数组的索引。因此无法匹配内部数组元素的位置并更新它。

我强烈建议将您的结构更改为“展平”为单个阵列,更适合这些操作。