我需要帮助使用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});
谢谢, 此致
答案 0 :(得分:0)
如果要更新嵌入文档,可以使用点表示法访问它。
对于上述文件,要更新“库存”中“item1”的“property1”:
db.inventory.update({"userId":"h8566d9482gghffhtry565"},{"$set":{"inventory.item1.property1":"1"}})
答案 1 :(得分:0)
问题在于"路径"是动态的,我不知道哪个项目会被修改。是用户决定项目的哪些属性发生变化,我找到了这个解决方案:
<tagname attr="attr">Sample</tagname>