在mongodb中更新嵌套的嵌入式文档

时间:2013-12-11 06:55:44

标签: java mongodb

我是mongodb的新手。 Plz帮助我。

我需要这样的文件

  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数据没有得到更新。我没有让wt出错。请帮帮我

提前致谢

1 个答案:

答案 0 :(得分: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它将始终有效,但只更新第一场比赛。