当前位置: 首页 > 知识库问答 >
问题:

MongoDB java驱动程序传递未定义的as值

东郭和光
2023-03-14

下面是mongoDB聚合,它在mongoDB集合项中过滤测试数组。

db.getCollection('yourcollection')
.aggregate([
{"$match": {"tests.someField": {"$exists": true}}},
{ $project:{"tests": {"$filter": {"input": "$tests", "as": "item", 
    "cond": {"$ne": ["$$item.someField", undefined]}}}}
},
])

在使用java BasicDBObject时,将“undefined”作为字符串,而不是JSundefined

    BasicDBObject projectionFilterInput=new BasicDBObject("input","$tests")
        .append("as", "item")
        .append("cond",new BasicDBObject("$ne", Arrays.asList("$$item.someField","undefined")));

因此,这将解释“cond”:{“$NE”:[“$$item.vidaptorCode”,“undefined”]}}}“undefined”而不是undefined。因此,这将不会按照预期筛选项目。

mongodb java驱动程序库中是否有为这个特定的undefined值定义的常量?这是主要的问题。

不管是谁好奇...

为什么我不使用ODM?

实际上,我们确实为MongoDB使用Spring数据,但它不支持这种聚合cond

    MatchOperation matchStage = Aggregation.match(new Criteria("tests.someField").exists(true));        
    ProjectionOperation projection = Aggregation.project("tests");  

Aggregation aggregation 
      = Aggregation.newAggregation(matchStage, projection);
    
    AggregationResults<LabConfiguration> output 
      = mongoTemplate.aggregate(aggregation, "yourcollection", YourClass.class);
    Projections filterProjection = projection(
            "tests",
            expression(
                    "$filter",
                    new BasicDBObject("input","$tests")
                    .append("as", "item")
                    .append("cond",new BasicDBObject("$ne", Arrays.asList("$$item.someField","undefined")))
            )
    );

共有1个答案

姜奇
2023-03-14

正如其他人在我的操作中评论的那样,替代方法是使用$ifnull

实际上,我希望使用{extists:true}但它不是有效的聚合cond运算符,或者类似$IFNotNull之类的东西会更好,不过它也可以通过$IFNull来实现。

如您所知,投影使用0和1,即{name:1,_id:0}

所以,我决定在$ifnull并且它工作时返回0

Java MongoDB核心驱动方式

BasicDBObject projectionFilterInput=new BasicDBObject("input","$tests")
.append("as", "item")
.append("cond",new BasicDBObject("$ifNull",Arrays.asList("$$item.someField",0)));
 类似资料:
  • 我的目标是使用聚合框架创建一个管道来对我的数据进行分组,然后将这个管道与java驱动程序一起使用。MongoDB v4.0.3 我使用MongoDB Compass创建了以下管道(减少到重要部分): 这导致以下(生成的)Java代码: 集合中$组阶段之前的数据如下所示: $组阶段应返回以下数据结构: 问题所在 Mongo Compass按预期预览了阶段的结果,但使用java驱动程序的阶段的结果非常

  • 我目前正在开发一个在soapui中维护的测试套件。此测试套件还包含一些web功能测试,这些测试以和

  • 我试图弄清楚,在使用Tableau连接器SDK创建自定义JDBC连接器时,如何让Tableau识别我的JDBC驱动程序。当前,当Tableau加载我的自定义连接器时,我可以告诉驱动程序找不到,因为连接器中显示了一个链接,该链接显示: > 在图表日志中,我可以看到。包含我的驱动程序的jar文件通过搜索它们的名称来识别,它们显示在日志中。 日志环境部分摘录: 未识别的驱动程序屏幕截图显示下载驱动程序

  • 问题内容: 我正在尝试禁用Chrome控制台的输出。如果我通过–start-maximized选项,则可以正常工作。我可能输入了错误的命令? 我也试过 输出量 已启动的ChromeDriver端口= 26703版本= 23.0.1240.0日志= / Brett / workspace / TestNG / chromedriver.log [1214/161331:ERROR:ipc_sync_

  • 问题内容: 我正在尝试禁用Chrome控制台的输出。如果我通过–start-maximized选项,则可以正常工作。我可能输入了错误的命令? 我也试过 输出量 已启动的ChromeDriver端口= 26703版本= 23.0.1240.0 log = / Brett / workspace / TestNG / chromedriver.log [1214/161331:ERROR:ipc_sy

  • 我试图在我的angular2应用程序中使用ng2上传器,我试图在我的视图中添加一个按钮点击上传操作,我试图像文档一样解释 component.ts component.html 但我在导航器中遇到了以下错误: 错误:ReferenceError:UPLOAD_指令未定义(…)ZoneDelegate。调用@angular2 polyfills。js:332Zone。运行@angular2 poly