2016-08-01 58 views
0

我正在使用MongoDB C#驅動程序版本2.2。我的收藏包含「父」對象。每個父對象都有一個子對象數組。每個孩子都有名稱值:MongoDB C#驅動程序,使用正則表達式查詢數組元素

"parent": { 
    "children":[ 
     { "name": "Bob", "age": 10}, 
     { "name": "Alice", "age": 7}, 
     { "name": "Tobias", "age": 11} 
    ] 
} 

我需要翻譯下面的代碼到C#語句/ LINQ語法:

db.getCollection('Parents').find({'parent.children': { $elemMatch: { 'name': { $regex: '.*ob.*', $options: 'im' } }}}) 

我發現有像

var builder = Builders<BsonDocument>.Filter; 
builder.Regex("parent.children.name", new BsonRegularExpression(".*ob.*")); //does not work with array 

方法
builder.AnyEq("parent.children.name", "ob"); //without regex 

B我不明白如何結合他們。請指教。

UPDATE:

我使用的,現在下面,請糾正我,如果你知道一個原因,它不應該正常工作:

builder.AnyEq("parent.children.name", new BsonRegularExpression(".*ob.*")) 
+0

您的最終查詢看起來對我來說很好,順便說一句! –

回答

1

我使用現在以下:

builder.AnyEq("parent.children.name", new BsonRegularExpression(".*ob.*")) 
+0

很好的答案..恭喜.. –

0

不能測試C#這臺機器上。讓我知道如果這不起作用:

var filter = Builders<People>.Filter.ElemMatch(x => x.Parent.Children, x => Regex.IsMatch(x.Name, "regex")); 
var res = await collection.Find(filter).ToListAsync(); 

這裏有一個竅門,你可能會喜歡順便說一句:

// Take your inputted `find` query string: 
string bsonQuery = "{'parent.children': { $elemMatch: { 'name': { $regex: '.*ob.*', $options: 'im' } }}}"; 

// Use it as the filter! 
var filter = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(bsonQuery); 

// Results: 
var result = col.FindSync (filter).ToList(); 
+0

在你的例子中你使用類(強類型)。我所擁有的是「路徑」的點綴符號。你能改善你的例子嗎? – Antipod

+0

@Antipod查找COPOs。當使用C#查詢時,他們會讓你的生活變得更加輕鬆。 –

+0

感謝您的更新。我幾乎可以肯定提供的更新將起作用。問題是:它是一個字符串,我不想構造字符串,我們可以使用驅動程序中的方法,驅動程序將爲我們構建查詢,畢竟:)談到POCO,我100%同意你,但我有一個要求 - JSON沒有定義的結構,它是動態的。 – Antipod