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的球队
为此,我们使用$ninnot 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 }

