MongoDB学习(翻译3)
支持的where字句(比较多,今天先写一部分)
本节介绍支持的where字句
正如前面提到的,不是所有的C#表达式都支持where子句。您可以以此文为指导,或者你可以尝试表达,看看它是否工作(如果不支持,抛出运行时异常,)。
Where字句通常使用where查询操作运算符来介绍,但是在某些情况下,我们必须通过&&合并使用它。
注意:
在1.4版本中还有些限制,但是之后的版本已经解除了,所以在此不再翻译。
- && (与操作)
子表达式可以通过&&合并来查询满足所有子表达式的文档
var query = from c in collection.AsQueryable<C>() where c.X > 0 && c.Y > 0 select c; // or var query = collection.AsQueryable<C>() .Where(c => c.X > 0 && c.Y > 0);
上面语句可转化为下述mongodb查询语句
{ X : { $gt : 0 }, Y : { $gt : 0 } } |
在某些情况下我们也可以使用$and操作符,如下面例子:查询c.X被2整除同时被3整除的文档对象:
var query = from c in collection.AsQueryable<C>() where (c.X % 2 == 0) && (c.X % 3 == 0) select c; // or var query = collection.AsQueryable<C>() .Where(c => (c.X % 2 == 0) && (c.X % 3 == 0));
上面例子可以转化为下面使用了 $and的mongodb查询语句
{ $and : [{ X : { $mod : [2, 0] } }, { X : { $mod : [3, 0] } }] } |
- Any
这个方法是用来测试集合中字段或属性是否包含任何项。
var query = from c in collection.AsQueryable<C>() where c.A.Any() select c; // or var query = collection.AsQueryable<C>() .Where(c => c.A.Any());
如果A存在一个或者多个项,则会匹配。
可转化为下面mongodb查询语句
{ A : { $ne : null , $not : { $size : 0 } } }
|
- Any (含谓词)
这个方法用来测试集合中所有项,它会产生一个$elemMatch条件:
var query = from c in collection.AsQueryable<C>() where c.A.Any(a => a.B == 1) select c; // or var query = collection.AsQueryable<C>() .Where(c => c.A.Any(a => a.B == 1));
可转化为下面mongodb查询语句:
{ A : { $elemMatch : { B : 1 } } } |
- Boolean 常量
这种形式主要是完整性。你可能会使用很少。它使用一个布尔常数来匹配或不匹配文档。
var query = from c in collection.AsQueryable<C>() where true select c; // or var query = collection.AsQueryable<C>() .Where(c => true);
可转化为下面mongodb查询语句:
{ _id : { $exists : true } }
|
将匹配所有文档,因为_id是必填字段
- Boolean 字段或属性
一个布尔值的字段或属性的文档没有必要和true进行比较,因为它本身已经在where的时候隐式的和true进行了比较。
var query = from c in collection.AsQueryable<C>() where c.B select c; // or var query = collection.AsQueryable<C>() .Where(c => c.B);
可转化为下面mongodb查询语句:
{ B : true }
|
- Contains (可枚举的方法)
根据上下文这个方法有两种用法
1.测试一个集合中的字段或者属性是否包含一个特定的值:
1. var query = 2. from c in collection.AsQueryable<C>()
3. where c.A.Contains(123)
4. select c;
5. // or 6. var query = 7. collection.AsQueryable<C>()
8. .Where(c => c.A.Contains(123));
可转化为下面mongodb查询语句:
{ A : 123 } |
这个转换依赖于mongodb查询语言对集合项中字段的处理方式
2.测试一个字段或者属性是否包含在一个集合中
var local = new [] { 1, 2, 3 }; var query =
from c in collection.AsQueryable<C>()
where local.Contains(c.A)
select c;
// or
var query =
collection.AsQueryable<C>()
.Where(c => local.Contains(c.A));
可转化为下面mongodb查询语句:
{ A : { $ in : [1, 2, 3] } }
|
- Contains (字符串方法)
这个方法用来筛选对象字符串类型的字段或者属性是否包含一个特定的子串:
var query = from c in collection.AsQueryable<C>() where c.S.Contains("abc") select c; // or var query = collection.AsQueryable<C>() .Where(c => c.S.Contains("abc"));
可转化为下面mongodb查询语句:(使用正则表达式):
{ S : /abc/ } |
- ContainsAll (LINQ to MongoDB 扩展方法)
这个方法用于筛选集合中项字段或者属性是否包含提供的所有值:
var query = from c in collection.AsQueryable<C>() where c.A.ContainsAll(new[] { 1, 2, 3 }) select c; // or var query = collection.AsQueryable<C>() .Where(c => c.A.ContainsAll(new[] { 1, 2, 3 }));
可转化为下面mongodb查询语句:
{ A : { $all : [1, 2, 3] } } |
- ContainsAny (LINQ to MongoDB 扩展方法)
这个方法用于筛选集合中项的字段或者属性是否包含任何一个提供的值:
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 }));
可转化为下面mongodb查询语句:
{ A : { $in : [1, 2, 3] } }
- Count 方法 (集合数量、长度)
该方法用于筛选一个可枚举的含有特定数量项的字段或者属性。
var query = from c in collection.AsQueryable<C>() where c.L.Count() == 3 select c; // or var query = collection.AsQueryable<C>() .Where(c => c.L.Count() == 3);
可转化为下面mongodb查询语句:
{ L : { $size: 3 } } |
- Count 属性 (集合长度)
和方法用法一样,生成同样的查询语句
var query = from c in collection.AsQueryable<C>() where c.L.Count == 3 select c; // or var query = collection.AsQueryable<C>() .Where(c => c.L.Count == 3);
可转化为下面mongodb查询语句::
{ L : { $size: 3 } } |
剩下的待续。。。