Mongo 子阵列上的管道投影
Mongo pipeline projection on sub array
我有以下文件:
{
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"}}, "weekEnd" : { "$gte" : { "$date" : "2021-03-10T00:00:00Z"}}}},
}
有效。
- 当然我不知道plan是来自unbounded还是bounded field,所以我尝试添加or运算符,导致根本没有选择。
我是不是漏了什么?
(使用 spring 数据 mongo)
谢谢
好的,发现...我错误地使用了来自 spring 数据 mongo 的 OrOperator class:
new Criteria("field1").orOperator(new Criteria("field2"))
与
不同
new Criteria().orOperator(new Criteria("field1"), new Criteria("field2")
我有以下文件:
{
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"}}, "weekEnd" : { "$gte" : { "$date" : "2021-03-10T00:00:00Z"}}}},
}
有效。
- 当然我不知道plan是来自unbounded还是bounded field,所以我尝试添加or运算符,导致根本没有选择。
我是不是漏了什么? (使用 spring 数据 mongo)
谢谢
好的,发现...我错误地使用了来自 spring 数据 mongo 的 OrOperator class:
new Criteria("field1").orOperator(new Criteria("field2"))
与
不同new Criteria().orOperator(new Criteria("field1"), new Criteria("field2")