MongoDB-查询文档
在此MongoDB教程中,我们将学习查询文档。
选择所有文件
要选择集合中的所有文档,我们使用find()
方法。
在以下示例中,我们列出了学生集合中的所有文档。
> db.students.find(); { "_id" : ObjectId("5d16c9e9e8cb73839ac9f2f1"), "firstname" : "", "lastname" : "", "studentid" : "s01" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f2"), "firstname" : "Jane", "lastname" : "Doe", "studentid" : "s02" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f3"), "firstname" : "John", "lastname" : "Doe", "studentid" : "s03" } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f4"), "firstname" : "Alice", "lastname" : "Doe", "studentid" : "s04", "score" : 10.5 } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f5"), "firstname" : "Bob", "lastname" : "Doe", "studentid" : "s05", "date_of_birth" : ISODate("2000-01-01T00:00:00Z") } { "_id" : ObjectId("5d16cfa4e8cb73839ac9f2f6"), "firstname" : "Eve", "lastname" : "Doe", "studentid" : "s06", "contact_phone" : { "primary" : { "number" : "+919800000000", "name" : "Bill Doe", "relation" : "Father" }, "secondary" : [ { "number" : "+919800000001", "name" : "Mac Doe", "relation" : "Brother" } ] } }
选择所有文档并以易于阅读的格式呈现
为了使结果以易于阅读的格式呈现,我们使用pretty()
方法。
在下面的示例中,我们选择了学生集合中的所有文档,并以易于阅读的格式列出了它们。
> db.students.find().pretty(); { "_id" : ObjectId("5d16c9e9e8cb73839ac9f2f1"), "firstname" : "", "lastname" : "", "studentid" : "s01" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f2"), "firstname" : "Jane", "lastname" : "Doe", "studentid" : "s02" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f3"), "firstname" : "John", "lastname" : "Doe", "studentid" : "s03" } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f4"), "firstname" : "Alice", "lastname" : "Doe", "studentid" : "s04", "score" : 10.5 } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f5"), "firstname" : "Bob", "lastname" : "Doe", "studentid" : "s05", "date_of_birth" : ISODate("2000-01-01T00:00:00Z") } { "_id" : ObjectId("5d16cfa4e8cb73839ac9f2f6"), "firstname" : "Eve", "lastname" : "Doe", "studentid" : "s06", "contact_phone" : { "primary" : { "number" : "+919800000000", "name" : "Bill Doe", "relation" : "Father" }, "secondary" : [ { "number" : "+919800000001", "name" : "Mac Doe", "relation" : "Brother" } ] } }
find()方法等效于以下SQL语句。
SELECT * FROM students;
计算集合中的文档总数
要检查集合中的文档总数,我们使用count()
方法。
> db.students.count({}) 6
注意! count方法的第一个参数是查询。
由于我们希望在不使用任何过滤器的情况下计算文档总数,因此我们将" {}"作为查询参数。
我们也可以使用countDocuments()
方法。
> db.students.countDocuments({}) 6
注意! countDocuments方法的第一个参数是查询。
由于我们希望不使用任何过滤器就对文档总数进行计数,因此我们将" {}"作为查询参数。
根据字段的特定值选择文档
在以下示例中,我们为学生集合中的"姓氏"字段选择所有具有值" Doe"的对偶。
> db.students.find({ "lastname": "Doe" }); { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f2"), "firstname" : "Jane", "lastname" : "Doe", "studentid" : "s02" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f3"), "firstname" : "John", "lastname" : "Doe", "studentid" : "s03" } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f4"), "firstname" : "Alice", "lastname" : "Doe", "studentid" : "s04", "score" : 10.5 } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f5"), "firstname" : "Bob", "lastname" : "Doe", "studentid" : "s05", "date_of_birth" : ISODate("2000-01-01T00:00:00Z") } { "_id" : ObjectId("5d16cfa4e8cb73839ac9f2f6"), "firstname" : "Eve", "lastname" : "Doe", "studentid" : "s06", "contact_phone" : { "primary" : { "number" : "+919800000000", "name" : "Bill Doe", "relation" : "Father" }, "secondary" : [ { "number" : "+919800000001", "name" : "Mac Doe", "relation" : "Brother" } ] } }
同样,我们可以使用两个或者多个字段来过滤文档。
在下面的示例中,我们选择具有" John"和" lastname"相同的" firstname"作为" Doe"的文档。
> db.students.find({ "firstname": "John", "lastname": "Doe" }); { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f3"), "firstname" : "John", "lastname" : "Doe", "studentid" : "s03" }
选择特定字段
我们可以控制要在结果中返回的字段。
语法:
> db.collectionName.find({ /*query*/}, { /*fields*/});
为了包括特定字段,我们提到字段名称并将其设置为1。
在下面的示例中,我们要返回学生的名字和姓氏。
> db.students.find({}, { "firstname": 1, "lastname": 1 }); { "_id" : ObjectId("5d16c9e9e8cb73839ac9f2f1"), "firstname" : "", "lastname" : "" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f2"), "firstname" : "Jane", "lastname" : "Doe" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f3"), "firstname" : "John", "lastname" : "Doe" } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f4"), "firstname" : "Alice", "lastname" : "Doe" } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f5"), "firstname" : "Bob", "lastname" : "Doe" } { "_id" : ObjectId("5d16cfa4e8cb73839ac9f2f6"), "firstname" : "Eve", "lastname" : "Doe" }
注意!默认情况下,返回_id字段。
为了防止它出现在我们的输出中,我们必须设置" _id":0
。
在下面的示例中,我们将过滤不带_id字段的学生的名字和姓氏。
> db.students.find({}, { "firstname": 1, "lastname": 1, "_id": 0 }); { "firstname" : "", "lastname" : "" } { "firstname" : "Jane", "lastname" : "Doe" } { "firstname" : "John", "lastname" : "Doe" } { "firstname" : "Alice", "lastname" : "Doe" } { "firstname" : "Bob", "lastname" : "Doe" } { "firstname" : "Eve", "lastname" : "Doe" }
从结果中排除特定字段
为了从结果中排除特定字段,我们提到了字段名称并将其设置为0。
在以下查询中,我们返回所有字段,但不包括" studentid"字段。
> db.students.find({}, { "studentid": 0 }); { "_id" : ObjectId("5d16c9e9e8cb73839ac9f2f1"), "firstname" : "", "lastname" : "" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f2"), "firstname" : "Jane", "lastname" : "Doe" } { "_id" : ObjectId("5d16c9efe8cb73839ac9f2f3"), "firstname" : "John", "lastname" : "Doe" } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f4"), "firstname" : "Alice", "lastname" : "Doe", "score" : 10.5 } { "_id" : ObjectId("5d16ca23e8cb73839ac9f2f5"), "firstname" : "Bob", "lastname" : "Doe", "date_of_birth" : ISODate("2000-01-01T00:00:00Z") } { "_id" : ObjectId("5d16cfa4e8cb73839ac9f2f6"), "firstname" : "Eve", "lastname" : "Doe", "contact_phone" : { "primary" : { "number" : "+919800000000", "name" : "Bill Doe", "relation" : "Father" }, "secondary" : [ { "number" : "+919800000001", "name" : "Mac Doe", "relation" : "Brother" } ] } }
逻辑运算符
我们可以使用以下逻辑运算符来过滤文档。
运算符 | 操作 | 示例 |
---|---|---|
$lt | 少于 | {字段:{$lt:value}} |
$lte | 小于或者等于 | {字段:{$lte:value}} |
$gt | 大于 | {字段:{$gt:value}} |
$gte | 大于或者等于 | {字段:{$gte:value}} |
$ne | 不等于 | {字段:{$ne:value}} |
$eq | 等于 | {字段:{$eq:value}} |
对于逻辑运算符示例,我们将使用记分板集合。
> db.scoreboard.find(); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2f9"), "team" : "Apple", "score" : 20 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fa"), "team" : "Banana", "score" : 15 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fb"), "team" : "Pineapple", "score" : 10 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fc"), "team" : "Watermelon", "score" : 30 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fd"), "team" : "Mango", "score" : 5 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fe"), "team" : "Orange", "score" : 25 }
查找所有得分低于15的球队
为此,我们使用$lt
小于运算符。
> db.scoreboard.find({ "score": { $lt: 15 } }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fb"), "team" : "Pineapple", "score" : 10 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fd"), "team" : "Mango", "score" : 5 }
查找所有得分小于或者等于15的球队
为此,我们使用小于或者等于运算符的$lte。
> db.scoreboard.find({ "score": { $lte: 15 } }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fa"), "team" : "Banana", "score" : 15 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fb"), "team" : "Pineapple", "score" : 10 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fd"), "team" : "Mango", "score" : 5 }
查找所有得分大于20的球队
为此,我们使用大于运算符的$gt
。
> db.scoreboard.find({ "score": { $gt: 20 } }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fc"), "team" : "Watermelon", "score" : 30 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fe"), "team" : "Orange", "score" : 25 }
查找所有得分大于或者等于20的球队
为此,我们使用大于或者等于运算符的$gte
。
> db.scoreboard.find({ "score": { $gte: 20 } }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2f9"), "team" : "Apple", "score" : 20 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fc"), "team" : "Watermelon", "score" : 30 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fe"), "team" : "Orange", "score" : 25 }
查找所有得分不等于5的球队
为此,我们使用不等于运算符的$ne。
> db.scoreboard.find({ "score": { $ne: 5 } }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2f9"), "team" : "Apple", "score" : 20 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fa"), "team" : "Banana", "score" : 15 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fb"), "team" : "Pineapple", "score" : 10 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fc"), "team" : "Watermelon", "score" : 30 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fe"), "team" : "Orange", "score" : 25 }
查找所有得分等于5的球队
为此,我们使用等于运算符的$eq。
> db.scoreboard.find({ "score": { $eq: 5 } }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fd"), "team" : "Mango", "score" : 5 }
In和Not in运算符
要基于一系列值过滤文档,我们可以在($in)运算符中使用,而不能在($nin)运算符中使用。
$in运算符将检查字段的值是否与任何给定值匹配。
格式:{栏位:{$in:[value1,value2,...]}}
$nin运算符将检查字段的值是否不匹配任何给定的值。
格式:{栏位:{$nin:[value1,value2,...]}}
查找所有得分为5、15或者20的球队
为此,我们使用$in运算符。
> db.scoreboard.find({ "score": { $in: [5, 15, 20] } }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2f9"), "team" : "Apple", "score" : 20 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fa"), "team" : "Banana", "score" : 15 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fd"), "team" : "Mango", "score" : 5 }
查找所有没有得分5、15和20的球队
为此,我们使用$nin
not in运算符。
> db.scoreboard.find({ "score": { $nin: [5, 15, 20] } }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fb"), "team" : "Pineapple", "score" : 10 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fc"), "team" : "Watermelon", "score" : 30 } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fe"), "team" : "Orange", "score" : 25 }
AND运算子
如果我们要选择符合所有条件的文档,则使用$and运算符。
在下面的示例中,我们从记分板集合中选择所有得分超过15分且处于活动状态的团队。
注意!在这个例子中,我将" isActive"字段添加到了记分板文档中。
> db.scoreboard.find({ $and: [ { "score": { $gt: 15 } }, { "isActive": true } ] }); { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fc"), "team" : "Watermelon", "score" : 30, "isActive" : true } { "_id" : ObjectId("5d16f2b4e8cb73839ac9f2fe"), "team" : "Orange", "score" : 25, "isActive" : true }
我们可以使用以下方法达到相同的结果。
> db.scoreboard.find({ "score": { $gt: 15 }, "isActive": true });
OR运算符
如果满足任何给定条件,我们使用$or运算符选择文档。
在以下示例中,我们选择所有活跃或者得分至少10分的团队。
我们正在显示团队名称,isActive和得分。
> db.scoreboard.find({ $or: [ { "isActive": true }, { "score": { $gte: 10 }} ] }, { "_id": 0, "team": 1, "score": 1, "isActive": 1 }); { "team" : "Apple", "score" : 20, "isActive" : false } { "team" : "Banana", "score" : 15, "isActive" : true } { "team" : "Pineapple", "score" : 10, "isActive" : false } { "team" : "Watermelon", "score" : 30, "isActive" : true } { "team" : "Orange", "score" : 25, "isActive" : true }
AND和OR运算符在一起
在以下示例中,我们获取了所有活跃且得分为15或者20或者25的团队。
我们列出了团队名称,得分和isActive字段。
> db.scoreboard.find({ "isActive": true, $or: [ { "score": 15 }, { "score": 20 }, { "score": 25 } ] }, { "team": 1, "score": 1, "isActive": 1, "_id": 0 }); { "team" : "Banana", "score" : 15, "isActive" : true } { "team" : "Orange", "score" : 25, "isActive" : true }