【问题标题】:Updating Nested Embedded Documents in mongodb在 mongodb 中更新嵌套的嵌入式文档
【发布时间】:2013-12-11 06:55:44
【问题描述】:

我是 mongodb 的新手。请帮我解决这个问题。

我需要这样的文件

  employee{ 
  _id:111,
 name:xxx,
 dependents : [ {
              name:a,
              age:51,
              dep_children:[{name:aa}{name:bb}{name:c}]
              } 

              {
              name:b,
              age:52,
              dep_children:[{name:aa}{name:bb}{name:c}]
              }
              {
              name:c,
              age:51,
              dep_children:[{name:aa}{name:bb}{name:cc}]
               }
              ]
        }

我正在使用以下脚本为 SQL 迁移数据并将其更新到 mongoDB

我的代码如下所示:

    while(personcount>=0)

    {  



        BasicDBObject doc = new BasicDBObject("_id",ind1.get(count)).

                append("name",ind2.get(count));

        coll.insert(doc);

       while(dependentcount>0) 
         {


           BasicDBObject querymongo = new BasicDBObject();
                  querymongo.put( "name",ind.get(count));

                      BasicDBObject tenant = new BasicDBObject();
                  tenant.put("name",indsa.get(innercount) );
                  tenant.put("age", indsa2.get(innercount));


                  BasicDBObject update = new BasicDBObject();
                  update.put("$push", new BasicDBObject("dependents",tenant));
                     coll.update(querymongo, update,true,true);
                      while(kidcount>0)
                         {



                    BasicDBObject querymongofact = new BasicDBObject();
                    querymongokid.put(  "dependent.name",indsa.get(innercount));
                      BasicDBObject tenantkid = new BasicDBObject();
                      tenantkid .put("name",indfact.get(innercountfact) );




                      BasicDBObject updatekid = new BasicDBObject();
                      updatekid .put("$push", new BasicDBObject("dependent.dep_children",tenantkid));

                      coll.update(querymongokid, updatekid ,true,true);
                          }
         }
       }

当我们打印 querymongokid 和 updatekid 时,其中的数据本身就是期望值。此代码不会引发任何错误。但在数据库中,唯一的 dep_children 数据没有得到更新。我没有弄错。请帮帮我

提前致谢

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    从某种意义上说,您的最后一个查询在 mongo 驱动程序中失败,更新没有效果 - 但这不是实际错误。让我重现你在 mongo shell 中所做的事情:

    > db.coll.insert({_id:1,name:"name1"})
    > db.coll.update({name:"name1"}, {"$push": {dependents: {name:"a", age:50}}})
    > db.coll.update({name:"name1"}, {"$push": {dependents: {name:"b", age:55}}})
    > db.coll.findOne()
    {
            "_id" : 1,
            "dependents" : [
                    {
                            "name" : "a",
                            "age" : 50
                    },
                    {
                            "name" : "b",
                            "age" : 55
                    }
            ],
            "name" : "name1"
    }
    > db.coll.update({"dependents.name": "a"}, {"$push": {"dependents.dep_children": {name:"aa"}}})
    can't append to array using string field name: dep_children
    > db.coll.update({"dependents.name": "a"}, {"$push": {"dependents.$.dep_children": {name:"aa"}}})
    > db.coll.findOne()
    {
            "_id" : 1,
            "dependents" : [
                    {
                            "age" : 50,
                            "dep_children" : [
                                    {
                                            "name" : "aa"
                                    }
                            ],
                            "name" : "a"
                    },
                    {
                            "name" : "b",
                            "age" : 55
                    }
            ],
            "name" : "name1"
    }
    

    不幸的是,我对原生 mongo java 驱动程序的经验很少(我通常在 Spring 数据上),但是改变你的行

    updatekid.put("$push", new BasicDBObject("dependent.dep_children",tenantkid));
    

    updatekid.put("$push", new BasicDBObject("dependent.$.dep_children",tenantkid));
    

    也应该这样做。

    这种行为的原因是“dependent.dep_children”不是有效的选择器,因为它对应于“转到子文档依赖项中的字段 dep_children”。但是,“依赖”恰好是一个没有任何字段的数组。 $ 替换显式索引,并确保从您的查询中选择正确的子文档。

    另请参阅here,以了解更不容易出错的查询公式 - 如果不使用 $elemMatch,它仅在您的查询唯一标识某个数组元素时才有效。使用 $elemMatch 它将始终有效,但只会更新第一个匹配项。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2010-11-11
      • 1970-01-01
      • 2011-04-19
      • 2017-04-28
      • 2014-09-23
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多