当前位置:  开发笔记 > 编程语言 > 正文

如何在mongo db中更新嵌套数组中的对象?

如何解决《如何在mongodb中更新嵌套数组中的对象?》经验,为你挑选了1个好方法。

假设我有以下文档结构:

{
    "name": "myProduct",
    "perspectives" : [
        {
            "name": "p1",
            "views" : [
                {
                    "name": "v1"
                },
                {
                    "name": "v2"
                }
            ]
        },
        {
            "name": "p2",
            "views" : [
                {
                    "name": "v1"
                },
                {
                    "name": "v2"
                }
            ]
        }
    ]
}

如何更新文档结构以向每个视图添加"别名"字段?

基本上我正在寻找像perspectives.views.alias:"av1"这样的所有perspectives.views.name:"v1".

结果结构如下所示:

{
    "name": "myProduct",
    "perspectives" : [
        {
            "name": "p1",
            "views" : [
                {
                    "name": "v1",
                    "alias": "av1" 
                },
                {
                    "name": "v2",
                    "alias": "av2" 
                } 
            ] 
        },
        {
            "name": "p2",
            "views" : [
                {
                    "name": "v1",
                    "alias": "av1" 
                },
                {
                    "name": "v2",
                    "alias": "av2" 
                } 
            ] 
        } 
    ]
}

为了澄清,我想做这样的事情:

foreach (view in product.perspectives.views)
{
    if (view.name == "p1")
      view.add("alias", "av1");
}

Niels van de.. 14

您必须循环访问文档,每个文档中的透视图以及每个透视图中的视图.然后更新视图并保存更新的文档.像这样的东西应该做的伎俩:

db.products.find().forEach(function (product) {
  product.perspectives.forEach(function (perspective) {
    perspective.views.forEach(function (view) {
      view.alias = "a" + view.name;
    })
  });

  db.products.save(product);
})

您可以将此功能粘贴到Mongo shell中并从那里运行它.作为替代方案,您可以将其保存在一个名为updateProducts.js的文件中并使用Mongo shell运行该文件:

mongo nameOfDatabase updateProducts.js

该功能将在服务器上执行,因此应该非常快.



1> Niels van de..:

您必须循环访问文档,每个文档中的透视图以及每个透视图中的视图.然后更新视图并保存更新的文档.像这样的东西应该做的伎俩:

db.products.find().forEach(function (product) {
  product.perspectives.forEach(function (perspective) {
    perspective.views.forEach(function (view) {
      view.alias = "a" + view.name;
    })
  });

  db.products.save(product);
})

您可以将此功能粘贴到Mongo shell中并从那里运行它.作为替代方案,您可以将其保存在一个名为updateProducts.js的文件中并使用Mongo shell运行该文件:

mongo nameOfDatabase updateProducts.js

该功能将在服务器上执行,因此应该非常快.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有