我正在尝试使用点表示法和$运算符更新MongoDB中的多级嵌入式文档。下面,我有一个由一个文档组成的集合:
capslock
我想通过以下方式更新此集合:
1)查询文档以匹配关键字数组中的capslock
键(在第3级嵌入文档中),其值为{
"_id" : ObjectId("55da48520549875d8480707c"),
"queried" : [],
"field" : "materials science",
"subfields" : [
{
"subfield_name" : "electronic materials",
"queried" : [],
"subfields_2" : [
{
"subfield_2_name" : "electronics",
"queried" : [],
"keywords" : [
{
"queried" : [],
"name" : "silicon"
},
{
"queried" : [],
"name" : "graphene"
},
{
"queried" : [],
"name" : "carbon nanotube"
},
{
"queried" : [],
"name" : "black phosphorus"
},
{
"queried" : [],
"name" : "phophorene"
},
{
"queried" : [],
"name" : "molybdenum disulphide"
}
],
},
{
"subfield_2_name" : "dielectrics",
"queried" : [],
"keywords" : [
{
"queried" : [],
"name" : "silicon oxide"
},
{
"queried" : [],
"name" : "aluminum oxide"
},
{
"queried" : [],
"name" : "hafnium dioxide"
},
{
"queried" : [],
"name" : "hexagonal boron nitride"
},
{
"queried" : [],
"name" : "Zirconium dioxide"
}
],
},
],
}
]
}
2)然后,我想在具有键值对"name"
"carbon nanotube"
键数组中附加时间戳(time()
)
"queried":[]
我知道这可以在update()命令中完成:
"name":"carbon nanotube"
但我认为我的点符号出错,因为我收到错误{
"_id" : ObjectId("55da48520549875d8480707c"),
"queried" : [],
"field" : "materials science",
"subfields" : [
{
"subfield_name" : "electronic materials",
"queried" : [],
"subfields_2" : [
{
"subfield_2_name" : "electronics",
"queried" : [],
"keywords" : [
{
"queried" : [],
"name" : "silicon"
},
{
"queried" : [],
"name" : "graphene"
},
{
"queried" : [1359147763.02],
"name" : "carbon nanotube"
},
{
"queried" : [],
"name" : "black phosphorus"
},
{
"queried" : [],
"name" : "phophorene"
},
{
"queried" : [],
"name" : "molybdenum disulphide"
}
],
},
{
"subfield_2_name" : "dielectrics",
"queried" : [],
"keywords" : [
{
"queried" : [],
"name" : "silicon oxide"
},
{
"queried" : [],
"name" : "aluminum oxide"
},
{
"queried" : [],
"name" : "hafnium dioxide"
},
{
"queried" : [],
"name" : "hexagonal boron nitride"
},
{
"queried" : [],
"name" : "Zirconium dioxide"
}
],
},
],
}
]
}
。我是否需要更改我的架构才能执行此更新()或是否有其他方法来更新此嵌入式文档
答案 0 :(得分:0)
当前架构无法做到这一点。为了在不明确指定元素位置的情况下在数组中执行更新,您需要使用positional $
operator。因为您需要更新2个嵌套查询(请注意我已添加了另一个$
):
{$push: {"subfields.subfields_2.$.keywords.$.queried":time()}}
但这不起作用,因为$
运算符不能用于嵌套数组 - 更新中只能有一个位置$
运算符。
您需要修改架构以支持此功能。
例如,您可以将所有子字段存储在各自的文档中,并链接到其父文档以允许导航树结构(可能需要parent
字段上的索引)
{
"_id" : ObjectId("55da48520549875d84800000"),
"queried" : [],
"field" : "materials science"
}
{
"_id" : ObjectId("55da48520549875d84801111"),
"queried" : [],
"field" : "electronic materials",
"parent" : ObjectId("55da48520549875d84800000")
}
{
"_id" : ObjectId("55da48520549875d84802222"),
"queried" : [],
"field" : "electronics",
"parent" : ObjectId("55da48520549875d84801111"),
"keywords" : [{
"queried" : [],
"name" : "silicon"
}, {
"queried" : [],
"name" : "graphene"
}, {
"queried" : [],
"name" : "carbon nanotube"
}]
}
如果您想查看更多选项以满足您的要求,Mongo文档中有一节介绍如何Model Tree Structures。 上面的示例将是Model Tree Structures with Parent References,但是根据您查询集合的其他方式,还有其他模式可能会更好。