mongodb $lte 和 $gte 的 $and 操作未按预期的整数值工作
mongodb $and Operation for $lte and $gte not working as expected for Integer value
我创建了以下聚合管道,它根据某些过滤器从两个集合中获取数据。主要的 table 是分配:
{
"aggregate":"Allocation",
"pipeline":[
{
"$match":{
"$and":[
{
"allocPush.weekNum":{
"$gte":202109
}
},
{
"allocPush.weekNum":{
"$lte":202114
}
},
{
"statusCode":{
"$in":[
"C",
"L"
]
}
}
]
}
},
{
"$lookup":{
"from":"Drug",
"localField":"articleId",
"foreignField":"_id",
"as":"drugData"
}
},
{
"$unwind":"$drugData"
},
{
"$sort":{
"articleId":1,
"sapStoreNum":1,
"batchNum":1,
"allocPush.weekNum":1
}
}
]
}
在我的分配集合中,我有一个名为 allocPush 的嵌入式文档,它是一个对象列表。
我有一个分配文档,其中包含两个 allocPush 文档,如下所示:
一个的 weekNum 值为 202107,另一个 202117
在我的聚合管道中,我有一个 $and 条件来验证它需要获取 allocPush.weekNum 值在 202109[ 之间的文档=43=] 和 202114
但此聚合仍获取具有 allocPush.weekNum 值 202107 和 202117 的记录(两者都不在 202109 之间& 202114)
当我将两个 allocPush 文档的 weekNum 值更改为 202107 或两者都更改为 202117 时,它不会获取记录
不确定为什么会这样?
这是 $elemMatch
的工作。
这些查询条件
{
"allocPush.weekNum":{
"$gte":202109
}
},
{
"allocPush.weekNum":{
"$lte":202114
}
}]
应用于整个文档。由于文档包含一个大于 202109
的 allocPush.weekNum
并且文档还包含一个小于 202114
的文档,因此整个文档满足这两个条件。
您可能想检查的是数组的单个元素是否介于这两个值之间。 $elemMatch
允许您指定数组的单个元素必须满足的条件才能使文档匹配。
这可能看起来像:
{
"allocPush": {
"$elemMatch":{
"weekNum":{
"$gte":202109,
"$lte":202114
}
}
}
}
我创建了以下聚合管道,它根据某些过滤器从两个集合中获取数据。主要的 table 是分配:
{
"aggregate":"Allocation",
"pipeline":[
{
"$match":{
"$and":[
{
"allocPush.weekNum":{
"$gte":202109
}
},
{
"allocPush.weekNum":{
"$lte":202114
}
},
{
"statusCode":{
"$in":[
"C",
"L"
]
}
}
]
}
},
{
"$lookup":{
"from":"Drug",
"localField":"articleId",
"foreignField":"_id",
"as":"drugData"
}
},
{
"$unwind":"$drugData"
},
{
"$sort":{
"articleId":1,
"sapStoreNum":1,
"batchNum":1,
"allocPush.weekNum":1
}
}
]
}
在我的分配集合中,我有一个名为 allocPush 的嵌入式文档,它是一个对象列表。
我有一个分配文档,其中包含两个 allocPush 文档,如下所示:
一个的 weekNum 值为 202107,另一个 202117
在我的聚合管道中,我有一个 $and 条件来验证它需要获取 allocPush.weekNum 值在 202109[ 之间的文档=43=] 和 202114
但此聚合仍获取具有 allocPush.weekNum 值 202107 和 202117 的记录(两者都不在 202109 之间& 202114)
当我将两个 allocPush 文档的 weekNum 值更改为 202107 或两者都更改为 202117 时,它不会获取记录
不确定为什么会这样?
这是 $elemMatch
的工作。
这些查询条件
{
"allocPush.weekNum":{
"$gte":202109
}
},
{
"allocPush.weekNum":{
"$lte":202114
}
}]
应用于整个文档。由于文档包含一个大于 202109
的 allocPush.weekNum
并且文档还包含一个小于 202114
的文档,因此整个文档满足这两个条件。
您可能想检查的是数组的单个元素是否介于这两个值之间。 $elemMatch
允许您指定数组的单个元素必须满足的条件才能使文档匹配。
这可能看起来像:
{
"allocPush": {
"$elemMatch":{
"weekNum":{
"$gte":202109,
"$lte":202114
}
}
}
}