使用Java在多个条件下更新Mongo嵌套数组

如何解决使用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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-