正在更新 MongoDB 中的嵌套数组文档
Updating nested array document in MongoDB
所以我有一个这样的 mongo 文档,我需要根据 val
更新数组
{
"_id" : NumberLong(222),
"pattern":"grain"
"BASIC" : {
"frame":"clear"
"tin" : [
{
"val" : "abc",
"unit" : NumberLong(2311)
},
{
"val" : "def",
"unit" : NumberLong(2311)
},
]
}
}
这是我试过的代码
collection = db.getCollection("test");
Bson where = new Document().append("_id", 222).append("BASIC.tin.val","abc");
Bson update = new Document()
.append("BASIC.tin.$.val", "xyz");
Bson set = new Document().append("$set", update);
try {
UpdateResult result = collection.updateOne(where , set, new UpdateOptions().upsert(true));
if(result.getMatchedCount()>0){
System.out.println("updated");
System.out.println(result.getModifiedCount());
}else{
System.out.println("failed");
}
} catch (MongoWriteException e) {
e.printStackTrace();
}
更新工作正常,但如果查找失败则不会更新
这是我得到的错误:
com.mongodb.MongoWriteException: 位置运算符未从查询中找到所需的匹配项。未扩展更新:BASIC.tin.$.val
在 com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:558)
在 com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:542)
无法将更新插入到嵌入式文档中,因此出现错误。因此,要模拟嵌入式文档的更新插入,您需要像下面这样更新您的代码。这将检查修改后的计数,如果为 0,则意味着我们需要在嵌入式文档中插入一个新文档,为此使用推送。对于您拥有的示例文档,这将使用 "pqr" 作为 val 和 "unit" 作为 400 进行更新。
Bson where = new Document().append("_id", 222).append("BASIC.tin.val","pqr");
Bson update = new Document()
.append("BASIC.tin.$.val", "xyz");
Bson set = new Document().append("$set", update);
try {
UpdateResult result = collection.updateOne(where , set, new UpdateOptions());
if(result.getModifiedCount() > 0){
System.out.println("updated");
} else if(result.getModifiedCount()==0){
System.out.println("upserting");
Bson where1 = new Document().append("_id", 222);
Bson upsert = new Document().append("BASIC.tin", new Document().append("val", "pqr").append("unit", 400));;
Bson push = new Document().append("$push", upsert);
UpdateResult result1 = collection.updateOne(where1 , push, new UpdateOptions());
if(result1.getModifiedCount() == 1)
System.out.println("upserted");
}else {
System.out.println("failed");
}
} catch (MongoWriteException e) {
e.printStackTrace();
}
upsert 后的示例响应
{
"_id": NumberLong(222),
"pattern": "grain",
"BASIC": {
"frame": "clear",
"tin": [{
"val": "xyz",
"unit": NumberLong(2311)
}, {
"val": "def",
"unit": NumberLong(2311)
}, {
"val": "pqr",
"unit": 400
}]
}
}
所以我有一个这样的 mongo 文档,我需要根据 val
更新数组{
"_id" : NumberLong(222),
"pattern":"grain"
"BASIC" : {
"frame":"clear"
"tin" : [
{
"val" : "abc",
"unit" : NumberLong(2311)
},
{
"val" : "def",
"unit" : NumberLong(2311)
},
]
}
}
这是我试过的代码
collection = db.getCollection("test");
Bson where = new Document().append("_id", 222).append("BASIC.tin.val","abc");
Bson update = new Document()
.append("BASIC.tin.$.val", "xyz");
Bson set = new Document().append("$set", update);
try {
UpdateResult result = collection.updateOne(where , set, new UpdateOptions().upsert(true));
if(result.getMatchedCount()>0){
System.out.println("updated");
System.out.println(result.getModifiedCount());
}else{
System.out.println("failed");
}
} catch (MongoWriteException e) {
e.printStackTrace();
}
更新工作正常,但如果查找失败则不会更新 这是我得到的错误:
com.mongodb.MongoWriteException: 位置运算符未从查询中找到所需的匹配项。未扩展更新:BASIC.tin.$.val 在 com.mongodb.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:558) 在 com.mongodb.MongoCollectionImpl.update(MongoCollectionImpl.java:542)
无法将更新插入到嵌入式文档中,因此出现错误。因此,要模拟嵌入式文档的更新插入,您需要像下面这样更新您的代码。这将检查修改后的计数,如果为 0,则意味着我们需要在嵌入式文档中插入一个新文档,为此使用推送。对于您拥有的示例文档,这将使用 "pqr" 作为 val 和 "unit" 作为 400 进行更新。
Bson where = new Document().append("_id", 222).append("BASIC.tin.val","pqr");
Bson update = new Document()
.append("BASIC.tin.$.val", "xyz");
Bson set = new Document().append("$set", update);
try {
UpdateResult result = collection.updateOne(where , set, new UpdateOptions());
if(result.getModifiedCount() > 0){
System.out.println("updated");
} else if(result.getModifiedCount()==0){
System.out.println("upserting");
Bson where1 = new Document().append("_id", 222);
Bson upsert = new Document().append("BASIC.tin", new Document().append("val", "pqr").append("unit", 400));;
Bson push = new Document().append("$push", upsert);
UpdateResult result1 = collection.updateOne(where1 , push, new UpdateOptions());
if(result1.getModifiedCount() == 1)
System.out.println("upserted");
}else {
System.out.println("failed");
}
} catch (MongoWriteException e) {
e.printStackTrace();
}
upsert 后的示例响应
{
"_id": NumberLong(222),
"pattern": "grain",
"BASIC": {
"frame": "clear",
"tin": [{
"val": "xyz",
"unit": NumberLong(2311)
}, {
"val": "def",
"unit": NumberLong(2311)
}, {
"val": "pqr",
"unit": 400
}]
}
}