2015-10-20 89 views
0

什么是查询更新以下数据与猫鼬。所以3个领域将被更新。顶级父点,类别点和标记点。猫鼬,更新孩子会影响所有父母吗?

{ 
"_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" 
     } 
    ] 
    } 
] 
} 

到这个。当用户从特定标签获得一个点时,它会影响所有家长。比方说,用户从C#中获得10分,那么我必须更新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} does not work out @vmkcom This works db.users.update({categories:{$ elemMatch:{name:“Sport”}}},{$ inc :{“categories。$。points”:6666,points:7777}}) –

+0

ofc,@YagizOzturk,忘记了操作员的订单。 – vmkcom

+0

感谢您的回答,真的帮了我。但是第二个孩子是C#呢?有没有办法在同一个查询中更新它的观点?在你的例子中,它不会递增@ vmkcom –