如何解决使用Java在多个条件下更新Mongo嵌套数组
我有以下文件:
{
"_id" : ObjectId("5d42501efbf6f6108277ceb3"),"customer" : {
"id" : "02c59458-8f0a-4a11-bff6-55b4710bc546","name" : "brookfield"
},"userId" : "86c241de-16de-417d-8537-ed441fee9b0e","username" : "Fonville_f888f976_un_","userGroups" : [],"lastSeen" : ISODate("2020-05-06T20:21:49.140Z"),"devices" : [
{
"id" : "A920B6F24B63479B8796B709EA542951","displayId" : "A920B6F24B63479B8796B709EA542951","manufacturedId" : false,"lastSeen" : ISODate("2020-03-20T14:36:24.961Z"),"product" : {
"manufacturer" : "PSman","manufacturerCode" : 10,"name" : "BlackHawk 880 series","modelId" : "C053"
}
},{
"id" : "2476B0E045712cc-5904-11ea-af28-0612af3fc862","displayId" : "2476B0E16929512870992618563","lastSeen" : ISODate("2020-01-09T20:59:48.650Z"),"product" : {
"manufacturer" : "GN","manufacturerCode" : 5,"name" : "Telenor Speak 710","modelId" : "2476","vendorId" : "B0E"
}
}
],"software" : {
"applicationId" : "f81d4fae-7dec-11d0-a765-00a0c91e6bf6","version" : "3.12.52334.30629","displayVersion" : "3.12.0"
},"lastHost" : {
"name" : "hn_5934d3c5dbf","platform" : "WIN","osVersion" : "10.0.17763"
}
}
我必须根据 product modelId 字段更新设备阵列中的每个 产品名称。 因此,用户将传递两个modelId值,如果其中之一与产品的modelId匹配,则应更新该产品的产品名称。 我编写了以下代码,并使用mongo db 4.2版对其进行了测试,并且可以正常工作。问题是,当我使用较旧版本的mongo db(3.4.23)测试它时,它不起作用,并且出现以下异常:
com.mongodb.MongoCommandException: Command failed with error 9 (FailedToParse): 'Unrecognized field in update operation: arrayFilters' on server localhost:27017. The full response is { "ok" : 0.0,"errmsg" : "Unrecognized field in update operation: arrayFilters","code" : 9,"codeName" : "FailedToParse" }
这是我的方法的样子:
private void updateCollection(String firstPid,String secondPid,String newProductName) {
MongoCollection<Document> collection = mongoTemplate.getCollection("user");
BasicDBObject searchQueryOne = new BasicDBObject();
BasicDBObject searchQueryTwo = new BasicDBObject();
BasicDBList or = new BasicDBList();
BasicDBObject query = new BasicDBObject("$or",or);
BasicDBObject updateQuery = new BasicDBObject();
searchQueryOne.append("devices.product.modelId",firstPid);
searchQueryTwo.append("devices.product.modelId",secondPid);
or.add(searchQueryOne);
or.add(searchQueryTwo);
updateQuery.append("$set",new BasicDBObject().append("devices.$[elem].product.name",newProductName));
collection.updateMany(query,updateQuery,new UpdateOptions().arrayFilters(
Collections.singletonList( Filters.in("elem.product.modelId",Arrays.asList(firstPid,secondPid)))));
}
请帮助
解决方法
经过重新搜索后,我设法解决了我的问题。如果有人遇到类似问题,这是对我有用的代码
public void updateUserCollection(String pidOne,String pidTwo) {
MongoCollection<Document> userCollection = mongoTemplate.getCollection("user");
BasicDBObject deviceCriteria = new BasicDBObject("devices.product.modelId",new BasicDBObject("$in",Arrays.asList(pidOne)));
FindIterable<Document> cursor = userCollection.find(deviceCriteria);
MongoCursor<Document> iterator = cursor.iterator();
while (iterator.hasNext()) {
Document user = iterator.next();
String userId = user.get("userId",String.class);
List<Document> devices = user.get("devices",List.class);
for (Document device : devices) {
Document product = device.get("product",Document.class);
String modelId = product.get("modelId",String.class);
if (modelId != null && (modelId.equals(pidOne) || modelId.equals(pidTwo))) {
product.put("name",newProductName);
}
}
saveUser(userId,user,userCollection);
}
iterator.close();
}
private void saveUser(String userId,Document user,MongoCollection<Document> userCollection) {
BasicDBObject updateQuery = new BasicDBObject("$set",user);
BasicDBObject searchQuery = new BasicDBObject("userId",userId);
userCollection.updateMany(searchQuery,updateQuery);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。