草庐IT

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

coder 2023-11-06 原文

我是 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 数据没有得到更新。我没有弄错。请帮助我

提前致谢

最佳答案

在更新无效的意义上,您的最后一个查询在 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 它将始终有效,但只会更新第一个匹配项。

关于java - 在 mongodb 中更新嵌套的嵌入式文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20512510/

有关java - 在 mongodb 中更新嵌套的嵌入式文档的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  7. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

  10. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

随机推荐