基本查询示例

Section 4.1: Find()

检索集合中的所有文档

db.collection.find({});

使用条件检索集合中的文件(类似于 MYSQL 中的 WHERE)

db.collection.find({key: value});
example
  db.users.find({email:"sample@email.com"});

使用布尔条件检索集合中的文档(查询操作符)

//AND
db.collection.find( {
$and: [
{ key: value }, { key: value }
]
})
//OR
db.collection.find( {
$or: [
{ key: value }, { key: value }
]
})
//NOT
db.inventory.find( { key: { $not: value } } )

更多布尔操作和示例请参见此处

注意:即使找到了匹配的文档,find() 也会继续搜索集合,因此在大型集合中使用时效率很低,但是通过仔细地对数据建模和/或使用索引,可以提高find() 的效率。

Section 4.2: FindOne()

db.collection.findOne({});

查询功能类似于 find(),但它会在找到一个符合其条件的文档时结束执行,如果与空对象一起使用,它会获取第一个文档并返回。findOne() mongodb api. 文档

Section 4.3: 对 find() 方法的结果进行限制、跳过、排序和计数

与聚合方法类似,find() 方法也可以对结果进行限制、跳过、排序和计数。假设我们有以下集合

db.test.insertMany([
{name:"Any", age:"21", status:"busy"},
{name:"Tony", age:"25", status:"busy"},
{name:"Bobby", age:"28", status:"online"},
{name:"Sonny", age:"28", status:"away"},
{name:"Cher", age:"20", status:"online"}
])

列出集合的清单:

db.test.find({})

返回结果:

{ "_id" : ObjectId("592516d7fbd5b591f53237b0"), "name" : "Any", "age" : "21", "status" : "busy" }
{ "_id" : ObjectId("592516d7fbd5b591f53237b1"), "name" : "Tony", "age" : "25", "status" : "busy" }
{ "_id" : ObjectId("592516d7fbd5b591f53237b2"), "name" : "Bobby", "age" : "28", "status" : "online"
}
{ "_id" : ObjectId("592516d7fbd5b591f53237b3"), "name" : "Sonny", "age" : "28", "status" : "away" }
{ "_id" : ObjectId("592516d7fbd5b591f53237b4"), "name" : "Cher", "age" : "20", "status" : "online"
}

跳过前 3 份文件:

db.test.find({}).skip(3)

返回结果:

{ "_id" : ObjectId("592516d7fbd5b591f53237b3"), "name" : "Sonny", "age" : "28", "status" : "away" }
{ "_id" : ObjectId("592516d7fbd5b591f53237b4"), "name" : "Cher", "age" : "20", "status" : "online"
}

按字段名称降序排序:

db.test.find({}).sort({ "name" : -1})

返回结果:

{ "_id" : ObjectId("592516d7fbd5b591f53237b1"), "name" : "Tony", "age" : "25", "status" : "busy" }
{ "_id" : ObjectId("592516d7fbd5b591f53237b3"), "name" : "Sonny", "age" : "28", "status" : "away" }
{ "_id" : ObjectId("592516d7fbd5b591f53237b4"), "name" : "Cher", "age" : "20", "status" : "online"
}
{ "_id" : ObjectId("592516d7fbd5b591f53237b2"), "name" : "Bobby", "age" : "28", "status" : "online"
}
{ "_id" : ObjectId("592516d7fbd5b591f53237b0"), "name" : "Any", "age" : "21", "status" : "busy" }

如果要升序排序,只需用 1 代替 -1

计算结果

db.test.find({}).count()

返回结果:

5

此外,还允许组合使用这些方法。例如,从降序排序的集合中获取 2 个文档,跳过前 1 个文档:

db.test.find({}).sort({ "name" : -1}).skip(1).limit(2)

返回结果:

{ "_id" : ObjectId("592516d7fbd5b591f53237b3"), "name" : "Sonny", "age" : "28", "status" : "away" }
{ "_id" : ObjectId("592516d7fbd5b591f53237b4"), "name" : "Cher", "age" : "20", "status" : "online"
}

Section 4.4: 查询文档 - 使用 AND、OR 和 IN 条件

students 集合中的所有文件。

> db.students.find().pretty();
{
"_id" : ObjectId("58f29a694117d1b7af126dca"),
"studentNo" : 1,
"firstName" : "Prosen",
"lastName" : "Ghosh",
"age" : 25
}
{
"_id" : ObjectId("58f29a694117d1b7af126dcb"),
"studentNo" : 2,
"firstName" : "Rajib",
"lastName" : "Ghosh",
"age" : 25
}
{
"_id" : ObjectId("58f29a694117d1b7af126dcc"),
"studentNo" : 3,
"firstName" : "Rizve",
"lastName" : "Amin",
"age" : 23
}
{
"_id" : ObjectId("58f29a694117d1b7af126dcd"),
"studentNo" : 4,
"firstName" : "Jabed",
"lastName" : "Bangali",
"age" : 25
}
{
"_id" : ObjectId("58f29a694117d1b7af126dce"),
"studentNo" : 5,
"firstName" : "Gm",
"lastName" : "Anik",
"age" : 23
}

与上述命令类似的 mySql 查询。

sql SELECT * FROM students;

db.students.find({firstName:"Prosen"});
{ "_id" : ObjectId("58f2547804951ad51ad206f5"), "studentNo" : "1", "firstName" : "Prosen", "lastName" : "Ghosh", "age" : "23" }

与上述命令类似的 mySql 查询。

sql SELECT * FROM students WHERE firstName = "Prosen";

AND 查询

db.students.find({
"firstName": "Prosen",
"age": {
"$gte": 23
}
});
{ "_id" : ObjectId("58f29a694117d1b7af126dca"), "studentNo" : 1, "firstName" : "Prosen", "lastName"
: "Ghosh", "age" : 25 }

与上述命令类似的 mySql 查询。

sql SELECT * FROM students WHERE firstName = "Prosen" AND age >= 23

或查询

db.students.find({
"$or": [{
"firstName": "Prosen"
}, {
"age": {
"$gte": 23
}
}]
});
{ "_id" : ObjectId("58f29a694117d1b7af126dca"), "studentNo" : 1, "firstName" : "Prosen", "lastName"
: "Ghosh", "age" : 25 }
{ "_id" : ObjectId("58f29a694117d1b7af126dcb"), "studentNo" : 2, "firstName" : "Rajib", "lastName"
: "Ghosh", "age" : 25 }
{ "_id" : ObjectId("58f29a694117d1b7af126dcc"), "studentNo" : 3, "firstName" : "Rizve", "lastName"
: "Amin", "age" : 23 }
{ "_id" : ObjectId("58f29a694117d1b7af126dcd"), "studentNo" : 4, "firstName" : "Jabed", "lastName"
: "Bangali", "age" : 25 }
{ "_id" : ObjectId("58f29a694117d1b7af126dce"), "studentNo" : 5, "firstName" : "Gm", "lastName" :
"Anik", "age" : 23 }

与上述命令类似的 mySql 查询。

sql SELECT * FROM students WHERE firstName = "Prosen" OR age >= 23

以及 OR 查询

db.students.find({
firstName : "Prosen",
$or : [
{age : 23},
{age : 25}
]
});
{ "_id" : ObjectId("58f29a694117d1b7af126dca"), "studentNo" : 1, "firstName" : "Prosen", "lastName"
: "Ghosh", "age" : 25 }

与上述命令类似的 mySql 查询。

sql SELECT * FROM students WHERE firstName = "Prosen" AND age = 23 OR age = 25;

IN 查询 这种查询可以改进 OR 查询的多种用法

db.students.find(lastName:{$in:["Ghosh", "Amin"]})
{ "_id" : ObjectId("58f29a694117d1b7af126dca"), "studentNo" : 1, "firstName" : "Prosen", "lastName"
: "Ghosh", "age" : 25 }
{ "_id" : ObjectId("58f29a694117d1b7af126dcb"), "studentNo" : 2, "firstName" : "Rajib", "lastName"
: "Ghosh", "age" : 25 }
{ "_id" : ObjectId("58f29a694117d1b7af126dcc"), "studentNo" : 3, "firstName" : "Rizve", "lastName"
: "Amin", "age" : 23 }

与上述命令类似的 mySql 查询。

sql SELECT * FROM students WHERE lastName IN ('Ghosh', 'Amin')

Section 4.5: 使用预测的 “find() ”方法

带有预测功能的 find() 方法的基本语法如下

db.COLLECTION_NAME.find({},{KEY:1});

如果要显示不带年龄字段的所有文档,命令如下

db.people.find({},{age : 0});

如果要显示包含年龄字段的所有文档,命令如下

Section 4.6: 使用预测的 “find() ”方法

在 MongoDB 中,预测意味着只选择必要的数据,而不是选择文档的全部数据。

带有预测功能的 find() 方法的基本语法如下

> db.COLLECTION_NAME.find({},{KEY:1});

如果要显示不带年龄字段的所有文档,命令如下

> db.people.find({},{age:0});

如果只想显示年龄字段,命令如下

> db.people.find({},{age:1});

注意:在执行 find() 方法时,_id 字段始终会显示,如果不需要该字段,则需要将其设置为 0。

> db.people.find({},{name:1,_id:0});

注:1 表示显示字段,0 表示隐藏字段。