2015-10-20 2 views
0

Каков запрос обновить данные ниже с помощью mongoose. Таким образом, 3 поля будут обновлены. Лучшие родительские очки, категории очков и тегов.Mongoose, обновление ребенка затронет всех родителей?

{ 
"_id": "561fba5e7fac41a4055fad45", 
"fullName": "Test", 
"points": 45, 
"level": 1, 
"categories": [ 
    { 
    "name": "Computer Science", 
    "points": 15, 
    "level": 1, 
    "_id": "561fba5e7fac41a4055fad46", 
    "tags": [ 
     { 
     "name": "C#", 
     "points": 10, 
     "level": 1, 
     "_id": "561fba5e7fac41a4055fad47" 
     }, 
     { 
     "name": "Java", 
     "points": 5, 
     "level": 1, 
     "_id": "561fba5e7fac41a4055ert12" 
     } 
    ] 
    }, 
    { 
    "name": "History", 
    "points": 30, 
    "level": 2, 
    "_id": "562407d4e3edf2113f61ac37", 
    "tags": [ 
     { 
     "name": "WW2", 
     "points": 30, 
     "level": 2, 
     "_id": "56240797e3edf2113f61ac36" 
     } 
    ] 
    } 
] 
} 

к этому. Когда пользователь получает точку от определенного тега, он будет влиять на всех родителей. Скажем, пользователь получает 10 очков от C#, тогда мне нужно обновить mongodb.

{ 
"_id": "561fba5e7fac41a4055fad45", 
"fullName": "Test", 
**"points": 55,** 
"level": 1, 
"categories": [ 
    { 
    "name": "Computer Science", 
    **"points": 25,** 
    "level": 1, 
    "_id": "561fba5e7fac41a4055fad46", 
    "tags": [ 
     { 
     "name": "c#", 
     **"points": 20,** 
     "level": 1, 
     "_id": "561fba5e7fac41a4055fad47" 
     }, 
     { 
     "name": "Java", 
     "points": 5, 
     "level": 1, 
     "_id": "561fba5e7fac41a4055ert12" 
     } 
    ] 
    }, 
    { 
    "name": "History", 
    "points": 30, 
    "level": 2, 
    "_id": "562407d4e3edf2113f61ac37", 
    "tags": [ 
     { 
     "name": "WW2", 
     "points": 30, 
     "level": 2, 
     "_id": "56240797e3edf2113f61ac36" 
     } 
    ] 
    } 
] 
} 
+0

Возможной копия [Обновления вложенных массивов в MongoDB через Монго shell] (http://stackoverflow.com/questions/18573117/updating-nested-arrays-in-mongodb-via-mongo-shell) – chridam

+0

Возможный дубликат [Обновить все элементы в массиве в mongodb] (http: // stackoverflow.com/questio ns/33186596/update-all-elements-in-an-array-in-mongodb) – styvane

+0

Это не дубликаты, поскольку я пытаюсь увеличить все верхние родительские поля. @ user3100115 –

ответ

1

вы должны использовать $elemMatch для запроса вашего объекта

db.tests.update({_id: yourTestId, categories: {$elemMatch: {_id: categoryId}}}, {$set: {$inc: {"categories.$.points": 10, points: 10}}}) 

Так вам запрашивая только необходимый элемент массива и обновлять его значение с $ ссылки

+1

{$ inc} не работает @vmkcom Это работает db.users.update ({categories: {$ elemMatch: {name: "Sport"}}}, {$ inc : {"категории. $. points": 6666, points: 7777}}) –

+0

ofc, @YagizOzturk, забыл операторский заказ. – vmkcom

+0

спасибо за ответ, в первую очередь, помог мне на самом деле. Но как насчет второго ребенка, который является C#. Есть ли способ обновить его точку в том же запросе. В вашем примере он не получает incremented @vmkcom –

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