我有简单的收藏。我想推送有问题的项目,但它给了一个例外。我怎么解决它?
/ * 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}]})
答案 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
操作是可以的,但您很快就会发现“嵌套数组”不适合更新。这里的主要问题是“位置运算符”只能匹配“第一个”或“外部”数组的索引。因此无法匹配内部数组元素的位置并更新它。
我强烈建议将您的结构更改为“展平”为单个阵列,更适合这些操作。