子阵列上的 Mongo 管道投影

问题描述

我有以下文件

{
    id: "myId",boundedplan: {
        plannedWeeks: [
            0 : {
                weekStartDate: date
                weekEndDate: date
                plannedDays: []
            },...
        ]
    },unboundedplan: {
        plannedWeeks: [
            0 : {
                weekStartDate: date
                weekEndDate: date
                plannedDays: []
            },...
        ]
    }
}

这个计划代表了未来几周。该计划具有有界或无界计划。
(我在两个不同的字段上有相同的结构,因为在代码中它们对应于两个具有不同行为的不同类)。

我现在必须执行以下查询

获取给定日期的当前计划周”

我编写了以下管道:

[
    { "$match" : { "ownerId" : "defaultOwnerId"}},{ "$project" : { 
        "boundedplan" : 1,"unboundedplan" : 1,"plannedWeeks" : { 
            "$cond" : { 
                "if" : { "$ne" : ["$boundedplan",null]},"then" : "$boundedplan.plannedWeeks","else" : "$unboundedplan.plannedWeeks"}
            }
        }
    },{ "$match" : { 
        "boundedplan.plannedWeeks" : { 
            "$elemmatch" : { "weekStart" : { "$lte" : { "$date" : "2021-03-10T00:00:00Z"}},"weekEnd" : { "$gte" : { "$date" : "2021-03-10T00:00:00Z"}}}},"$or" : [{ 
            "unboundedplan.plannedWeeks" : { 
                "$elemmatch" : { "weekStart" : { "$lte" : { "$date" : "2021-03-10T00:00:00Z"}},"weekEnd" : { "$gte" : { "$date" : "2021-03-10T00:00:00Z"}}}}
        }]}
    }
]

问题如下:

  • 知道我正在使用无界计划执行计划并明确设置第二个匹配项:
"$match" : { 
    "unboundedplan.plannedWeeks" : { 
        "$elemmatch" : { "weekStart" : { "$lte" : { "$date" : "2021-03-10T00:00:00Z"}},}

有效。

  • 当然我不知道计划是来自无界还是有界字段,所以我尝试添加 or 运算符,这导致根本没有选择。

有什么我遗漏的吗? (使用 spring 数据 mongo)

谢谢

解决方法

好的,发现了……我错误地使用了 spring data mongo 中的 OrOperator 类:

new Criteria("field1").orOperator(new Criteria("field2")) 

不一样
new Criteria().orOperator(new Criteria("field1"),new Criteria("field2")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...