2017-01-11 52 views
3

使用MongoDB的老司機,我是能夠執行下面的查詢:LAMBDA哪裏失敗,但字符串,其中工程

Query.Where("this.plan.sstats.used < this.plan.sstats.available") 

但隨着新的,我不得不寫:

builder.Filter 
     .Where(t => t.Plan.StorageStats.UploadUsed < t.Plan.StorageStats.UploadAvailable) 

這些看起來是一樣的,但新一不工作,我收到此錯誤信息:

其他信息:不支持的過濾器:({plan.sstats.u sed} < {plan.sstats.available})。

後端版本目前是相同的,所以我沒有看到任何理由爲什麼這不應該繼續工作。

我該如何解決這個問題?有沒有更好的方法來做到這一點,同時保持原子性?

+0

當你說舊/新你使用的是什麼確切的版本? – Liam

+0

@Liam New是2.4,之前是1.something。我不再工作了,所以我無法檢查。 – john

回答

2

似乎MongoDb驅動器不再支持它。我親自看到兩個可能的解決方案:

1)您查詢BSON,不是你的目標,應該工作(我試圖與我的樣本數據輸出):

FilterDefinition<BsonDocument> filter = 
    new BsonDocument("$where", "this.plan.sstats.used<this.plan.sstats.available"); 

啥子是這種方法的缺點:您的應該查詢您的收藏集爲BsonDocument集合。

2)您查詢您的收藏爲ToEnumerable(),而不只是將您的過濾器添加爲Where linq語句。這也可以,但你直接在mongodb上查詢數據。

3)你可以使用聚合框架,我就是這麼做的:

var result = collection.Aggregate() 
     .Group(r => r.Plan.StorageStats.UploadUsed - r.Plan.StorageStats.UploadAvailable, 
       r => new {r.Key, Plans= r.Select(t=>t.Plan)}) 
     .Match(r=>r.Key < 0) 
     .ToEnumerable() 
     .SelectMany(r=>r.Plans); 

負上聚集的是,你不能與你通話Find()使用其他過濾器結合起來。

+0

Maksim,謝謝你的回覆。不幸的是,我們一直在使用它來進行原子更新,同時確保滿足某些條件,所以這種方法無效。 – john

+0

@john你仍然可以直接使用bson(解決方案1),否則你將不得不拆分你的查詢,並首先讀取你需要更新的所有id,而不是構建包含過濾器。 –

+0

這就是我希望避免:)謝謝你的幫助。 – john

2

所以,我還問了Mongo的JIRA,並將其作爲潛在的選擇。如果有人對Maksim的回答不滿意,我會在這裏發帖。


它可以創建只是一個過濾器定義:

FilterDefinition<C> filter = new JsonFilterDefinition<C>("{ $where : \"this.plan.sstats.used < this.plan.sstats.available\" }"); 

由於字符串可以轉換爲FilterDefinitions你也可以寫其中任何一個都最終創造一個JsonFilterDefinition: var filter = (FilterDefinition<C>)"{ $where : \"this.plan.sstats.used < this.plan.sstats.available\" }";

// or using an implicit conversion 

FilterDefinition<C> filter = "{ $where : \"this.plan.sstats.used < this.plan.sstats.available\" }"; 
以下的
+0

很酷,它的作品?你在做簡單的JSON過濾器並獲得你的計劃對象? –

+0

是的,它運作良好:) – john