2016-02-19 109 views
1

我有以下格式的MongoDB集合。

{ 
"_id" : ObjectId("56c6f03ffd07dc1de805e84f"), 
"Details" : { 
    "a" : [ 
      [ { 
       "DeviceID" : "log0", 
       "DeviceName" : "Dev0" 
       }, 
       { 
       "DeviceID" : "log1", 
       "DeviceName" : "Dev1" 
       } 
      ], 
      [ { 
       "DeviceID" : "Model0", 
       "DeviceName" : "ModelName0" 
       }, 
       { 
       "DeviceID" : "Model1", 
       "DeviceName" : "ModelName1" 
       } 
      ] 
     ] 
    } 
} 

,我試圖獲取所有在哪裏數組DeviceName「一」包含一個特定的值,說「NAME0」的文件。然而,我可以得到預期的結果,而使用下面的Mongo查詢:

db.test_collection.find({"Details.a":{$elemMatch:{$elemMatch:{DeviceName : /.*Name0.*/}}}}); 

現在我努力在C#中實現上述查詢。任何人都可以指導我嗎?

到目前爲止,我已經嘗試了下面的代碼,並如預期提前

query = Query.And(Query.ElemMatch("Details.a", Query.And(Query.ElemMatch("DeviceName", Query.Matches("DeviceName", new BsonRegularExpression("Name0")))))); 

由於它不工作

回答

4

那麼,在C#誠實編寫查詢是有點棘手,但你總是可以玩了一招。

var bsonQuery = "{'Details.a':{$elemMatch:{$elemMatch:{DeviceName : /.*Name0.*/}}}}"; 
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bsonQuery); 

var result = col.FindSync (filter).ToList(); 

我反序列化一個普通的MongoDB查詢到這回我傳遞給FindAsync作爲過濾器BsonDocument。

最後,您將在變量結果中獲得期望的結果。

注意:我假設MongoDB連接已建立並且變量col持有對MongoDB集合的引用。

編輯:請參閱以下鏈接https://groups.google.com/forum/#!topic/mongodb-csharp/0dcoVlbFR2A。現在已確認C#驅動程序不支持無名稱過濾器,因此暫時不支持使用Buidlers<BsonDocument>.Filter來編寫以上查詢。

長話短說,你只剩下一個選擇,那就是按照我上面在我的解決方案中提到的方式進行查詢。

+0

哇..很好!這正是我想要的方式。它創造了奇蹟。 Thanx很多Saleem .. :-) –