2015-06-15 2 views
1

есть простой сбор. Я хочу, чтобы вопрос был предметом, но он дает исключение. Как я могу его решить?push item в подлоге

/* 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" 
    } 
    } 
}) 

не может использовать часть (Вопросы вопросов.DataSource) для перемещения элемент ({Вопросы: [{_id: ObjectId ('557e8c9ba6df1a22041e087a'), CreationDate: новый Дата (1434356891784), IsActive: правда, имя: "Uio", требуется копаться: ложь, QuestionType: 1, AnswerInputType: 1 , AnswerValidationPattern: нуль, AnswerValidationMessage: нуль, QuestionOrder: 1, DataSource: [], DataSourceItemCount: 0}, {_id: ObjectId ('557e8c9fa6df1a22041e087b'), CreationDate: новые Дата (1434356895695), IsActive: правда, имя: "Iu", требуется копаться: ложь, QuestionType: 2, AnswerInputType: 1, AnswerValidationPattern: нулевой, AnswerValidationMessage: нулевой, QuestionOrder: 2, источник данных: [], DataSourceItemCount: 0}]})

+1

Возможный дубликат [MongoDB "Update Где" как в MySQL, но для массивов "(http://stackoverflow.com/questions/29918842/mongodb-update-where-like-in-mysql-but-for-arrays) – Yogesh

ответ

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 операций с вложенной структурой массива, вы быстро обнаружите, что «вложенные массивы» не подходят для обновления. Основная проблема здесь заключается в том, что «оператор позиционирования» может соответствовать только индексу «первого» или «внешнего» массива. Таким образом, невозможно совместить позицию внутреннего элемента массива и обновить его.

Я настоятельно рекомендую изменить структуру, чтобы «сгладить» как единый массив, который больше подходит для этих операций.

Смежные вопросы