我正在进行比较复杂的聚合管道操作,并出现了一个奇怪的现象 - 我提取了一个简短的示例以展示我的问题。
它似乎与MongoDb $addFields和$match有关 - 但是它并没有包含任何信息,使我能够解决手头的问题。
注意:请注意,我的问题不在于使用日期字段或处理值的具体示例,而在于我无法使用表达式进行$match
- 使用已添加的$addFields
字段或未添加的字段。
给定的MongoDB版本为:3.6.3(目前最新版本)
让我们插入一些测试数据:
db.testexample.insert({
"dateField": new ISODate("2016-05-18T16:00:00Z")
});
db.testexample.insert({
"dateField": new ISODate("2018-05-18T16:00:00Z")
});
现在让我们创建一个简单的管道,只计算日期的年份并进行匹配:
db.testexample.aggregate([
{
"$addFields": {
"dateFieldYear": {"$year": "$dateField"}
}
},
{
"$match": {
"dateFieldYear": {"$eq": "$dateFieldYear"}}
}
}
])
--> 没有匹配
它应该匹配,因为它是相同的字段?也许可以使用更多技巧(使用$add
)来匹配?
db.testexample.aggregate([
{
"$addFields": {
"dateFieldYear": {"$year": "$dateField"}
}
},
{
"$match": {
"dateFieldYear": {"$eq": {"$add": ["$dateFieldYear", 0]}}
}
}
])
--> 没有匹配项
仍然没有成功。接下来我认为问题出在变量上。让我们修正一下这些值:
db.testexample.aggregate([
{
"$addFields": {
"dateFieldYear": {"$year": "$dateField"}
}
},
{
"$match": {
"dateFieldYear": {"$eq": {"$add": [2016, 0]}}
}
}
])
--> 没有匹配项
等等.. 这里出了什么大问题.. 让我们用一个静态值来看看:
db.testexample.aggregate([
{
"$addFields": {
"dateFieldYear": {"$year": "$dateField"}
}
},
{
"$match": {
"dateFieldYear": 2016
}
}
])
--> 找到1个记录!
因此我的结论是$match
不能在聚合管道中使用字段表达式。但这似乎是不可能的-因为文档说明$match
遵循查询语法如此描述。
有人能帮忙解决如何使用简单的示例"dateFieldYear": {"$eq": "$dateFieldYear"}}
进行$match
吗?为什么它不能按预期工作?
非常感谢任何帮助