2012-07-24 21 views
0

我的文档有一个类型为List<string>的属性。 我想返回集合中的所有文档,其中一组字符串与此List<string>属性中的任何项匹配。C#mongodb其中OR列表<string>

我想构建这样类似下面的问题,但在C#:

MongoDB find where key equals string from array

我知道这是关闭的,但它是我最好的尝试:

var queryItems = new List<QueryComplete>(); 
queryItems.Add(Query.EQ("PropertyName", "test")); 
var query= Query.Or(queryItems.ToArray()); 
var qd = new QueryDocument(new BsonDocument { query.ToBsonDocument() }); 
var result = GetCollection<CollectionName>().FindAs<Type>(qd) 

回答

1

看起来像什么你正在寻找的是这里描述:

ContainsAny

此方法用于测试数组(或类似数组)的字段或属性是否包含任何提供的值。

var query = 
    from c in collection.AsQueryable<C>() 
    where c.A.ContainsAny(new[] { 1, 2, 3 }) 
    select c; 
// or 
var query = 
    collection.AsQueryable<C>() 
    .Where(c => c.A.ContainsAny(new[] { 1, 2, 3 })); 
+0

yes ContainsAny完美无缺。我现在在文档中看到。谢谢 – user376456 2012-07-25 22:32:15

1

如果由于某种原因,你不喜欢使用LINQ,您可以使用查询生成器来写这样的:

var setOfStrings = new BsonValue[] { "a", "b", "c" }; 
var query = Query.Or(
    Query.EQ("PropertyName", "test"), 
    Query.In("List", setOfStrings) 
); 
var cursor = collection.FindAs<C>(query); 

如果要仔细检查本机MongoDB的查询是什么样子你可以使用:

var json = query.ToJson(); 

在这种情况下显示了相当的MongoDB的查询是:

{ "$or" : [ 
    { "PropertyName" : "test" }, 
    { "List" : { "$in" : ["a", "b", "c"] } } 
] } 

如果这不是您寻找的本地MongoDB查询,请告诉我。

p.s.在1.5版中有一个新的查询生成器,现在QueryComplete已经过时。

+0

感谢您的额外信息和ToJson()方法。我将在shell中使用它来进行测试。也许这应该是一个额外的问题,但是有没有Linq查询ContainsAny会比上面的QueryBuilder慢或者他们是否生成相同的MongoDB查询的情况?这个线程对我理解Linq/Querybuilder/Mongodb shell查询很有帮助 – user376456 2012-07-25 22:36:39