2017-06-13 191 views
0

我有一個使用本機mongoDb的應用程序,現在我們將它指向Azure Cosmos數據庫實例,但是現在我們在查詢數組時沒有得到結果。MongoDB.Driver與Cosmos DB數組搜索

例如,我們有以下客戶:

{    
    "email" : "[email protected]",    
    "data" : {     
     "customerGuid" : "a30b5d75ca6241dcbd0260b2516a2165",         
     "addresses" : [ 
      {       
       "firstName" : "firstname", 
       "lastName" : "lastname",       
       "postalCode" : "SY1 3VE",       
      } 
     ] 
    } 
} 

而且我們正在使用的MongoDB.Driver(通過AsQueryable已和LINQ)找到所有客戶的地址數組中的一個項目匹配

var col = db.GetCollection<Customer>("Customer"); 
var custQuery = col.AsQueryable() 
    .Where(c => c.Data.Addresses.Any(a => a.PostalCode == "SY1 3VE")); 

但是,我沒有得到任何匹配。在進一步的挖掘,它似乎產生蒙戈查詢,看起來像:

{aggregate([{ "$match" : { "data.addresses.postalCode" : "SY1 3VE" } }])} 

當我嘗試手動對數據庫或者這並不爲我工作。

我做錯了什麼?或者是Cosmos Mongo Db實現與MongoDB.Driver不完全兼容呢?

+0

該查詢看起來不錯。你確定你在查詢正確的數據庫/集合嗎? – Veeram

+0

我很確定。如果我通過roboMongo 0結果運行同樣的事情,請將其編輯爲 aggregate([{「$ match」:{「data.addresses」:{$ elemMatch:{「postalCode」:「SY1 3VE」}}}}] ) 它然後工作! – Vdex

+0

單個查詢條件與elemMatch操作符一樣可用。 https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-condition。你可以嘗試在蒙戈殼? – Veeram

回答

1

我做錯了什麼?或者是Cosmos Mongo Db實現與MongoDB.Driver不完全兼容呢?

正如您所提到的那樣,Cosmos Mongo Db可能沒有像本地MongoDB那樣執行完整的命令。我想你也提到的代碼獲得

沒有記錄返回

但是我們可以使用過濾器來做到這一點,我有下面的代碼進行測試。它在我身邊正常工作。

var collection = db.GetCollection<BsonDocument>("BsonDocument"); 
var test = collection.Find(Builders <BsonDocument>.Filter.ElemMatch<BsonDocument>("data.addresses", 
        "{\"postalCode\":\"SY1 3VE\"}")).ToList(); 

enter image description here

另一種選擇:

根據我的經驗,這是不推薦,因爲它會查詢所有的文件到客戶端。

var col = db.GetCollection<Customer>("Customer"); 
var custQuery = collection.AsQueryable().ToList().Where(c => c.Data.Addresses.Any(a => a.PostalCode == "SY1 3VE")); 
+0

一樣行動。謝謝,我已將您標記爲答案,因爲我同意它看起來不受支持。在我的用例中,「另一種選擇」會過於沉重,因爲會有很多記錄。 – Vdex