MongoDB聚合管道:无法使用表达式进行$match过滤?

6

我正在进行比较复杂的聚合管道操作,并出现了一个奇怪的现象 - 我提取了一个简短的示例以展示我的问题。

它似乎与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吗?为什么它不能按预期工作?

非常感谢任何帮助

1个回答

9
您可以使用 $expr (3.6版本运算符) 在常规查询中使用聚合函数。
比较查询运算符聚合比较运算符
在您的情况下,
db.testexample.find({$expr:{$eq:["$dateFieldYear", "$dateFieldYear"]}})

常规查询:

db.testexample.find({$expr:{$eq:["$dateFieldYear", {"$year": "$dateField"}]}})

聚合查询:

db.testexample.aggregate({$match:{$expr:{$eq:["$dateFieldYear", {"$year": "$dateField"}]}})

啊,是的。我一发布问题,就在文档中看到了$expr;-)应该更仔细地看看。谢谢。 - narcoticfresh
我们可以在$expr中应用两个条件吗?我的意思是如果日期匹配vand和状态呢? - Kishor Patidar
1
@KishorPatidar 请查看$and运算符。 - Hunter Kohler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接