2016-07-18 4 views
0

Возможно ли обновить как документ, так и встроенный элемент массива из этого документа в одном запросе?MongoDB - обновленный внедренный документ И сам документ

E.g.

Team: 
{ 
    MembersCount: 1, 
    Members: [ 
     { 
     Id: 1, 
     Role: 1 
     }] 
} 

Пример запроса бы increment MemberCount, push an element to Members array и change the first member's role.

Мое исследование показывает, что вы можете обновить элемент документа или обновить массив, но не оба, поскольку запрос должен указывать либо на документе, либо на конкретный элемент, но, возможно, я что-то упустил.

EDIT: Теперь я знаю, что невозможно добавить элемент в массив баллов и изменить другой элемент в том же массиве (индекс этого элемента изменится - это мое объяснение).

+0

Из моего личного опыта, я могу сказать, мы не можем обновить массив и его свойство объекта одновременно. Поэтому мы должны использовать два запроса для приведенного выше результата. – rroxysam

ответ

0

Как вы обнаружили, вы не можете добавить к массиву при одновременном обновлении его элемента. В MongoDB v3.2, вы должны увидеть сообщение об ошибке:

Cannot update 'Members.0.Role' and 'Members' at the same time 

Альтернативный подход заключается в использовании cursor.forEach(). Например:

/* Find a document using _id */ 
db.collection.find({ 
        "_id":ObjectId("578cda18006d485d118c3b79") 
        }) 
        .forEach(function(doc){ 
           /* Increment MemberCount */ 
           doc['MemberCount']+=1; 
           /* Push an element to Members array */ 
           doc["Members"].push({"Id":2, "Role":9}); 
           /* Change the first member's role */ 
           doc["Members"][0]["Role"] = 3; 
           /* Save*/ 
           db.collection.save(doc) 
           }) 

Хотя вы должны повторно рассмотреть вопрос, является ли наиболее подходящим data model для использования приложения случае.