【问题标题】:Updating a multilevel embedded document in MongoDB在 MongoDB 中更新多级嵌入文档
【发布时间】:2017-07-01 20:01:45
【问题描述】:

我正在尝试使用点符号和 $ 运算符更新 MongoDB 中的多级嵌入式文档。下面,我有一个由一个文档组成的集合:

{
"_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"
                    }
                ],
            },
        ],
    }
]
}

我想通过以下方式更新此收藏:
1) 查询文档以匹配关键字数组(在第 3 级嵌入文档中)中的 "name" 键与值 "carbon nanotube"

2) 然后我想将时间戳 (time()) 附加到具有键值对 "name":"carbon nanotube" 的同一嵌入文档中的 "queried":[] 键数组中

{
"_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"
                    }
                ],
            },
        ],
    }
]
}

我知道这一切都可以在 update() 命令中完成:

topics.collection.update({"subfields.subfields_2.keywords.name":"carbon nanotube"}, {$push: {"subfields.subfields_2.keywords.$.queried":time()}})

但我认为我的点符号存在错误,因为我收到错误SyntaxError: invalid syntax。我是否需要更改架构才能执行此 update() 或者是否有其他方法来更新此嵌入文档

【问题讨论】:

    标签: mongodb schema embedded-documents database nosql


    【解决方案1】:

    这在当前架构下是不可能的。为了在不明确指定元素位置的情况下在数组中执行更新,您需要使用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,但根据您查询集合的其他方式,还有其他可能更好的模式。

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多