mongodb:如何比较文档中的String和聚合管道中由表达式构造的String

时间:2018-02-11 00:36:12

标签: mongodb mongodb-query aggregation-framework

我在MongoDB中创建视图时遇到了麻烦。我刚开始使用Mongo,所以这个问题看起来很傻。

我有以下文件:

{ 
    "_id" : NumberInt(12213054), 
    ... 
    "_dt" : {
        "_doc" : "time", 
        "time" : "01:30", 
        "date" : "04/02/18", 
        "tz" : "CET", 
        "tzoffset" : NumberInt(3600), 
        "uts" : NumberInt(1517704200)
    }, 
    ...
}

我正在尝试为日期为#04; 04/02/18的文档创建视图。 "_dt.date"字段的类型为String。我尝试使用$eq运算符进行比较。

我有以下查询来选择数据:

{$match: {
    "_dt.date": {
        $eq: { 
            $concat: [  
                {$dateToString: {
                    format: "%d/%m/",
                    date: new Date("2018-02-04")
                }},
                {$substr: [
                    {$year : new Date("2018-02-04")},
                    2,
                    2
                ]}
            ]
        }
    }
}
}

但是在执行查询后,结果为空。

子查询构造的日期字符串似乎是正确的:

db.matches.aggregate({ $project: { date:
{ 
            $concat: [
                {$dateToString: {
                    format: "%d/%m/",
                    date: new Date("2018-02-04")
                }},
                {$substr: [
                    {$year : new Date("2018-02-08")},
                    2,
                    2
                ]}
            ]
        }
}
}
)

输出是:

{ 
    "_id" : NumberInt(12213054), 
    "date" : "04/02/18"
}

有没有人知道为什么第一个查询不起作用?

1 个答案:

答案 0 :(得分:1)

$match按设计将字段与常量值与常规查询运算符进行比较。

为了比较mongodb中的两个字段,您要使用$match$expr与3.6中的聚合查询运算符。

比较query operatorsaggregation comparison operators

{"$match":{
  "$expr":{
    "$eq":[
      "$_dt.date", 
      {"$concat":[
        {"$dateToString":{"format":"%d/%m/","date":new Date("2018-02-04")}},
        {"$substr":[{"$year":new Date("2018-02-04")},2,2]}
      ]}
  }
}}

您只需传递在客户端创建的日期字符串并直接比较

即可
{"$match":{"_dt.date":"04/02/18"}}