组织MongoDB文档以更好地操作数据

时间:2017-04-13 16:09:39

标签: javascript mongodb

我需要帮助使用mongodb创建数据结构。 我使用JavaScript来操作数据。 我希望有这种类型的文档结构,但我不确定做正确的事情。我注意到你倾向于使用数组作为对象的容器,我也注意到mongodb更新运算符需要这种类型的结构。例如:

var mydoc = {
               _id: ObjectId("5099803df3f4948bd2f98391"),
               items:[ {"name": "name", "other": "other"},
                       {"name": "name", "other": "other"},
                       {"name": "name", "other": "other"}
                     ]}

但是以这种方式组织数据不喜欢:)我想要的文件如何:

{
  "_id": {
    "$oid": "dfdsdsfdsff54sdf5ds"
  },
  "displayName": "name",
  "userId": "h8566d9482gghffhtry565",
  "info": {
    "level": 1,
    "currentExperience": 0,
    "requiredExperience": 0,
    "missingExperience": 0
  },
  "statistics": {
    "total": {
      "stat1": 0,
      "stat2": 0,
      "stat3": 0,
      "stat4": 0
    },
    "best": {
      "distance": 0,
      "stat1": 0,
      "stat2": 0,
      "stat3": 0,
      "stat4": 0
    },
    "game": {
      "one": 0,
      "two": 0,
      "three": 0,
      "stat4": 0
    }
  },
  "inventory": {
    "item1": {
      "property1": 0,
      "property2": 0,
      "property3": 0,
      "property4": 0,
      "level": {
        "level": 1,
        "currentExperience": 0,
        "requiredExperience": 0,
        "missingExperience": 0
      },
      "skins": [
        "skin1",
        "skin2",
        "skin3"
      ]
    },
    "item2": {
      "property1": 0,
      "property2": 0,
      "property3": 0,
      "property4": 0,
      "level": {
        "level": 1,
        "currentExperience": 0,
        "requiredExperience": 0,
        "missingExperience": 0
      },
      "skins": [
        "skin1",
        "skin2",
        "skin3"
      ]
    }
  },
  "notifications": {},
  "rewards": {}
}

现在我解释一下我遇到的问题。 现在,如果我必须更改,例如,库存内的特定项目的属性,我采取对象"库存" - >我寻找我需要的项目,然后我修改属性。 在最后,使用更新运算符" $ set",我替换"库存"字段。

如果您的数据非常少,这可能会很好,但在该字段内会有数百个"子字段"这似乎是一种无用的浪费资源。

不幸的是,使用$ inc运算符,我无法以任何方式传递"路径"我要改变的财产。 你能救我吗?

这就是我现在所做的事情

var userDoc = myCollection("userData");
var userData = userDoc.findOne({"userId": userId}, {items: 1, _id: 0});
//Other code
userData.inventory[itemName][propertyName] = //other code;
userDoc.update({"userId": userId},{"$set": userData});

谢谢, 此致

2 个答案:

答案 0 :(得分:0)

如果要更新嵌入文档,可以使用点表示法访问它。

对于上述文件,要更新“库存”中“item1”的“property1”:

db.inventory.update({"userId":"h8566d9482gghffhtry565"},{"$set":{"inventory.item1.property1":"1"}})

答案 1 :(得分:0)

问题在于"路径"是动态的,我不知道哪个项目会被修改。是用户决定项目的哪些属性发生变化,我找到了这个解决方案:

<tagname attr="attr">Sample</tagname>