2016-10-16 65 views
0

我有一個文件,看起來像這裏面:MongoDB中查詢的子文檔中的元素相匹配的條件

{ 
    "spans" : [ 
     { 
      "from" : ISODate("2016-01-01T00:00:00.000+0000"), 
      "to" : ISODate("2016-01-02T00:00:00.000+0000") 
     }, 
     { 
      "from" : ISODate("2016-01-03T00:00:00.000+0000"), 
      "to" : ISODate("2016-01-04T00:00:00.000+0000") 
     }, 
     { 
      "from" : ISODate("2016-02-01T00:00:00.000+0000"), 
      "to" : ISODate("2016-02-04T00:00:00.000+0000") 
     } 
    ] 
} 

我想查詢爲一個文件,但只有一個從更大於2016年返回跨度-1-2

我第一次嘗試$ elemMatch,但它只返回第一個匹配的跨度。

這似乎是$filter運算符是正確的方式來做到這一點,但我似乎找不到任何ProjectionBuilder方法來做一個過濾器。

我覺得我想要做這樣的查詢:

.aggregate([ 
    { 
     $match:{/*Some other filter*/} 
    }, 
    { 
     $project: { 
     Spans: { 
      $filter: { 
       input: "$spans", 
       as: "span", 
       cond: { $gt: [ "$$span.from", ISODate("2016-01-02T00:00:00Z") ] } 
      } 
     } 
     } 
    } 
]) 

我想應該是這樣的,但沒有過濾器的方法

 var pb = new ProjectionDefinitionBuilder<MyObj>(); 

     var projection = pb.Combine(new List<ProjectionDefinition<MyObj>> { 
      pb.Filter(x => x.Spans, s => s.From > from))//no such thing... 
     }); 


     var result= _collection. 
      .Match(x=>/*my match*/) 
      .Project<MyObj>(projection) 
      .ToList(); 

我缺少什麼?是否應該使用ProjectionBuilder以外的其他東西?

+0

您的樣本是否包含日期數據?它顯示非日期數據。 – Saleem

+0

@Saleem是它在實際數據庫中的一個日期虐待更新我的JSON –

+0

您的示例數據包含無效的ISO日期:)日期應該是兩位數字格式。 – Saleem

回答

2

有兩種,可能有更多的方法可以解決這個問題。您可以使用$project$filter或普通的舊的和可信的$unwind

我正在編寫一個使用shell查詢的例子,並且很確定你可以很容易地轉換成C#。

溶液#1

db.collection.aggregate([ 
    {$unwind:"$spans"}, 
    {$match: {"spans.from": {$gt: ISODate("2016-01-02T00:00:00.000+0000")}}}, 
    {$group:{_id:"$_id", spans:{$push:"$spans"}}} 
]) 

溶液#2支持有關MongoDB版本3.2+僅

db.collection.aggregate([ 
    {$project: 
    {spans: 
     {$filter: 
     {input:"$spans", as: "spans", cond: 
      {$gt: ["$$spans.from", ISODate("2016-01-02T00:00:00.000+0000")]} 
     } 
     } 
    } 
    } 
]) 

例以上會過濾掉小於所有數組元素或等於ISODate("2016-01-02T00:00:00.000+0000")from結果爲:

{ 
    "_id" : ObjectId("5804123984d3eb497d538a6e"), 
    "spans" : [ 
     { 
      "from" : ISODate("2016-01-03T00:00:00.000+0000"), 
      "to" : ISODate("2016-01-04T00:00:00.000+0000") 
     }, 
     { 
      "from" : ISODate("2016-02-01T00:00:00.000+0000"), 
      "to" : ISODate("2016-02-04T00:00:00.000+0000") 
     } 
    ] 
} 
+0

過濾器查詢不起作用,如果我直接在數據庫中執行它,我似乎無法找到相關的c#方法來執行它,Unwind似乎在那裏,我給了一個去看看我是否可以得到那個去。我從閱讀中得到的理解是,放鬆比過濾要慢,是這樣嗎? –

+0

事實上'$ unwind'與'$ project/$ filter'不一樣,但它可以在大多數mongodb版本上運行。你的mongodb版本是什麼? – Saleem

+0

我正在使用3.2.10 –

相關問題