猫鼬,更新孩子会影响所有父母吗?

时间:2015-10-20 07:52:29

标签: node.js mongodb mongoose mongodb-query

使用 mongoose 更新以下数据的查询是什么。所以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"
      }
    ]
  }
]
}

1 个答案:

答案 0 :(得分:1)

您应该使用$elemMatch来查询对象

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

因此,您仅查询所需的数组元素,并使用$引用

更新其值