在mongodb中使用substr后,使用Match聚合的项目无法正常工作

时间:2016-03-31 06:18:40

标签: mongodb mongodb-query laravel-5.1

我面对mongodb的一次使用。

以下是我的样本记录。

{
    "_id" : ObjectId("56fa21da0be9b4e3328b4567"),
    "us_u_id" : "1459169911J4gPxpYQ7A",
    "us_dealer_u_id" : "1459169911J4gPxpYQ7A",
    "us_corporate_dealer_u_id" : "1459169173rgSdxVeMLa",
    "us_oem_u_id" : "1459169848CK5yOpXito",
    "us_part_number" : "E200026",
    "us_sup_part_number" : "",
    "us_alter_part_number" : "",
    "us_qty" : 0,
    "us_sale_qty" : 2,
    "us_date" : "20160326",
    "us_source_name" : "BOMAG",
    "us_source_address" : "",
    "us_source_city" : "",
    "us_source_state" : "",
    "us_zip_code" : "",
    "us_alternet_source_code" : "",
    "updated_at" : ISODate("2016-03-29T06:34:02.728Z"),
    "created_at" : ISODate("2016-03-29T06:34:02.728Z")
}

我试图让所有人都有独特的日期

所以,我使用聚合

进行了以下查询
.aggregate(
            [
                {
                    "$match":{
                            "yearSubstring":"2016",
                            "monthSubstring":"03",
                            "us_dealer_u_id":"1459169911J4gPxpYQ7A"
                            }
                },
                {
                    "$project":
                            {
                            "yearSubstring":{"$substr":["$us_date",0,4]},
                            "monthSubstring":{"$substr":["$us_date",4,2]},
                            "daySubstring":{"$substr":["$us_date",6,2]}
                            }
                },
                {
                    "$group":
                            {
                                "_id":{"monthSubstring":"$monthSubstring",
                                        "yearSubstring":"$yearSubstring",
                                        "daySubstring":"$daySubstring"
                                    },
                                "daySubstring":{"$last":"$daySubstring"}
                            }
                },
                {"$sort":{"us_date":1}}
            ]
        )

我尝试了两种方式来传递年份和月份(作为字符串和int)

但是我得到了空白的结果。

如果我从条件中移除月份和年份,那么记录就会出现。

主要是我尝试了所有差异。差异。解决方案,但结果是一样的。

提前感谢。

1 个答案:

答案 0 :(得分:3)

您写错了查询。

此阶段你没有 yearSubstring monthSubstring 字段。

    {
        "$match":{
                "yearSubstring":"2016",
                "monthSubstring":"03",
                "us_dealer_u_id":"1459169911J4gPxpYQ7A"
                }
    },

您应该写如下:

.aggregate(
            [
                {
                    "$match":{
                            "us_dealer_u_id":"1459169911J4gPxpYQ7A"
                            }
                },
                {
                    "$project":
                            {
                            "yearSubstring":{"$substr":["$us_date",0,4]},
                            "monthSubstring":{"$substr":["$us_date",4,2]},
                            "daySubstring":{"$substr":["$us_date",6,2]}
                            }
                },
                {
                    "$match":{
                            "yearSubstring":"2016",
                            "monthSubstring":"03"
                 }
        },
                {
                    "$group":
                            {
                                "_id":{"monthSubstring":"$monthSubstring",
                                        "yearSubstring":"$yearSubstring",
                                        "daySubstring":"$daySubstring"
                                    },
                                "daySubstring":{"$last":"$daySubstring"}
                            }
                },
                {"$sort":{"us_date":1}}
            ]
        )

如果您想获得其他字段,则应将它们包含在投影阶段。