【问题标题】:Mongoose, update of child will affect all parents?猫鼬,孩子的更新会影响所有的父母吗?
【发布时间】:2016-01-18 18:40:11
【问题描述】:

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

【问题讨论】:

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

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

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

所以您只查询需要的数组元素并使用$ 参考更新它的值

【讨论】:

  • {$inc} 不起作用@vmkcom 这有效 db.users.update({ categories : { $elemMatch: { name: "Sport" } } }, {$inc: {"categories. $.points": 6666, 点数: 7777}})
  • ofc,@YagizOzturk,忘记操作员命令。
  • 先谢谢你的回答,真的帮了我。但是第二个孩子是 C# 呢?有没有办法在同一个查询中更新它的点。在您的示例中,它不会增加@vmkcom
  • 这仅适用于“一级”嵌套。你肯定需要重组你的数据。看看这个例如stackoverflow.com/questions/4121666/…
猜你喜欢
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2015-03-26
  • 2022-10-02
相关资源
最近更新 更多