MongoDB-查询文档

时间:2020-02-23 14:40:52  来源:igfitidea点击:

在此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 }