【问题标题】:Update Mongo nested array using Java with multiple conditions使用具有多个条件的 Java 更新 Mongodb 嵌套数组
【发布时间】:2020-08-11 11:43:03
【问题描述】:

我有以下文件:

{
    "_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)))));
             
}

请帮忙

【问题讨论】:

  • 您可以在帖子中添加“什么不起作用”吗?

标签: java spring mongodb mongodb-query


【解决方案1】:

经过一番研究,我设法解决了我的问题。如果有人有类似的问题,这是对我有用的代码

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);
}

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 2013-12-26
    • 2020-04-26
    • 2021-07-14
    • 2018-10-22
    相关资源
    最近更新 更多