2016-03-31 41 views
1

我有一个使用mongodb的问题。在mongodb中使用substr后,聚合中匹配的项目不能使用

下面是我的样本记录。

{ 
    "_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)

但我得到空白的结果。

如果我从条件中删除月份和年份,然后记录来了。

大多我已尝试所有的差异。差异。解决方案但结果相同。

提前致谢。

+0

'$ match'在错误的地方。你需要它“之后”改变字段的'$ project'。你也可以在'$ project'或后续的'$ group'这个'us_date'字段中调用'$ sort'。你需要在这两个字段中包含这个字段,否则它根本就不存在。 –

+0

这也不是一个聪明的方式来匹配日期。使用“范围”而不是分手日期。这样做效率更高。 –

+0

@BlakesSeven我先告诉你,我尽力解决这个问题,但仍然没有结果 –

回答

3

你写了不正确的查询。

您还没有yearSubstringmonthSubstring此阶段的字段。

{ 
     "$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}} 
      ] 
     ) 

如果你想获得其他领域,你应该包括他们进入投影阶段。

+0

@Vladislav_Kievski谢谢你的支持 –