在MongoDB中更新多级嵌入式文档

时间:2015-08-29 21:05:50

标签: mongodb schema embedded-documents database nosql

我正在尝试使用点表示法和$运算符更新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" } ], }, ], } ] } 。我是否需要更改我的架构才能执行此更新()或是否有其他方法来更新此嵌入式文档

1 个答案:

答案 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,但是根据您查询集合的其他方式,还有其他模式可能会更好。