MongoDB 查询文档中使用比较选择器、逻辑选择器

本文介绍了MongoDB中用于查询文档的find()方法,包括查询语法和各种选择器,如相等($eq)、不等($ne)、大于($gt)等比较操作,以及$and、$or、$not等逻辑操作。示例展示了如何根据这些选择器筛选集合中的数据。
摘要由CSDN通过智能技术生成

一、查询语法

本篇我们主要讲解在集合或视图中查询文档,首先说明一下查询的语法:

db.collection.find(query, projection, options)

此定义可以从集合或者视图中查找文档并返回一个游标(cursor);

参数

query: 此选项可选,用于指定查询选择器,如果要查询集合中的所有文档,可省略此参数或者传递空文档{}

projection: 此选项可选,用于指定在文档中返回的字段,如果要返回匹配文档中的所有字段,可省略此参数。

options:此选项可选,用于指定查询的其他选项。可以用于修改查询行为以及返回结果的方法。

返回

一个指向符合查询条件的文档的游标。当 find() 方法"返回文档",该方法实际上是返回一个指向文档的游标。

二、Query选择器

1、比较选择器

1.1 相等($eq)

语法:{ <field>: { $eq: <value> } }

该表达式等效于:

{ <field>: <value> }

例子:

查询集合test所有的文档:

{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }

下面我们查询年龄=20的成员:

db.test.find({"age": { $eq: 20 }});

此查询等效于:

db.test.find({"age": 20});

这两个查询的结果一致,如下:

{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }

1.2 不相等($ne)

语法:{ <field>: { $ne: <value> } }

例子:

下面我们查询年龄!=20的成员:

db.test.find({"age": { $ne: 20 }});

查询的结果如下:

{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }

1.3 大于($gt)

语法:{ <field>: { $gt: <value> } }

例子:

下面我们查询年龄>22的成员:

db.test.find({"age": { $gt: 22 }});

查询的结果如下:

{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }

1.4 大于等于($gte)

语法:{ <field>: { $gte: <value> } }

例子:

下面我们查询年龄>=22的成员:

db.test.find({"age": { $gte: 22 }});

查询的结果如下:

{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }

1.5 小于($lt)

语法:{ <field>: { $lt: <value> } }

例子:

下面我们查询年龄<22的成员:

db.test.find({"age": { $lt: 22 }});

查询的结果如下:

{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }

1.6 小于等于($lte)

语法:{ <field>: { $lte: <value> } }

例子:

下面我们查询年龄<=22的成员:

db.test.find({"age": { $lte: 22 }});

查询的结果如下:

{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }

1.7 与数组中的任一值匹配($in)

语法:{ <field>: { $in: [ <value1>, <value2>, ... <valueN>] } }

例子:

下面我们查询年龄等于20或者22的成员:

db.test.find({"age": { $in: [ 20, 22 ] }});

查询的结果如下:

{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }

1.8 与数组中的值均不匹配($nin)

语法:{ <field>: { $nin: [ <value1>, <value2>, ... <valueN>] } }

例子:

下面我们查询年龄不等于20,22的成员:

db.test.find({"age": { $nin: [ 20, 22 ] }});

查询的结果如下:

{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }

2、逻辑选择器

2.1 并且($and)

语法:{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

查询满足所有表达式的文档。

例子:

下面我们查询年龄大于21并且小于24的成员:

db.test.find(
    { 
        $and: [ 
            {"age": {$lt: 24}}, 
            {"age": {$gt: 21}} 
        ] 
    }
);

查询的结果如下:

{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }

2.2 或者($or)

语法:{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

查询至少满足一个表达式的文档

例子:

下面我们查询年龄小于21或者大于24的成员:

db.test.find(
    { 
        $or: [ 
            {"age": {$gt: 24}}, 
            {"age": {$lt: 21}} 
        ] 
    }
);

查询的结果如下:

{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }

2.3 非($not)

语法:{ <field>: { $not: { <operator-expression> } } }

查询不满足表达式的文档

例子:

下面我们查询年龄不等于22的成员:

db.test.find({ "age": { $not: { $eq: 22 }} });

查询的结果如下:

{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }

2.4 或非($nor)

语法:{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }

查询不满足所有表达式的文档

例子:

下面我们查询“年龄不等于22并且姓名不等于张三”的成员:

db.test.find(
    { 
        $nor: [ 
            {"age": {$eq: 22}}, 
            {"name": "张三"} 
        ] 
    }
);

查询的结果如下:

{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }

操作monodb的c#封装,调用非常方便,可以继承,功能包括: 1、所有数据库操作 2、前台表格类数据获取 public List GetList(List lstColName, Document query, JqGridParam jqParam, ref int count),封装了通用的获取前台表格数据的方法,将在工程中减少大量数据库访问代码,有了这个后对前台表格类查询我们可以不用在Control里使用linq或者封装在Model里然后对前台定义视图类了,使用如下: try { JqGridParam jqParam = new JqGridParam(); jqParam.page = 1; jqParam.rows = 1000; MemberOper memOper = new MemberOper(); MongoBasicOper monOper = new MongoBasicOper(DTName.GROUP_MEMBER); int count = 0; //过滤条件 Document query = new Document(); if (!string.IsNullOrEmpty(find)) { MongoRegex reg = new MongoRegex(".*" + find + ".*"); query.Add(DColName.Name, reg); } query.Add(DColName.GroupId, g); Document[] docStatus = new Document[] { new Document(DColName.Status, RowStatus.Pass), new Document(DColName.Status, RowStatus.Admin) }; query.Add("$or", docStatus); //查询列 List lstColName = new List(); lstColName.Add(DColName.UserId); lstColName.Add(DColName.UserName); //查询数据 var lstRes = monOper.GetListEx(lstColName, query, jqParam, ref count); //转换返回值 JqGrid jg = new JqGrid(); if (count == 0) { return Json(jg.toNull(jqParam), JsonRequestBehavior.AllowGet); } var jsonData = jg.toJson(jqParam, count, lstRes, lstColName); jsonData.param = g; return Json(jsonData, JsonRequestBehavior.AllowGet); } catch (Exception e) { return Json(e.Message, JsonRequestBehavior.AllowGet); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值