gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:44:03 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com