1. MongoDB的基本概念
MongoDB是一种面向文档的数据库管理系统,它是由C++语言编写而成的。与传统的关系型数据库不同,MongoDB使用文档(document)来存储和表示数据。
文档是一种由键值对组成的结构,键值对被称为字段。在MongoDB中,每一个文档都有一个唯一的_id标识符,它是一个12字节的 BSON 类型的值。BSON 类型是指二进制 JSON(JavaScript Object Notation)
2. MongoDB的查询语句
2.1 基本查询
在MongoDB中,使用find()函数进行查询。如下语句表示在mydb的user集合中查找所有文档:
db.user.find()
find()函数的参数可以为查询条件,如下语句表示查询年龄为20的用户:
db.user.find({age:20})
在查询结果中,可以使用pretty()函数将结果格式化:
db.user.find().pretty()
下面是一个完整的基本查询示例:
db.user.insertMany([
{ name: "Jack", age: 20, sex: "male" },
{ name: "Alice", age: 25, sex: "female" },
{ name: "Bob", age: 30, sex: "male" }
])
db.user.find()
查询结果如下:
{
"_id" : ObjectId("5f5c16b56058f7417f0b10f9"),
"name" : "Jack",
"age" : 20,
"sex" : "male"
}
{
"_id" : ObjectId("5f5c16b56058f7417f0b10fa"),
"name" : "Alice",
"age" : 25,
"sex" : "female"
}
{
"_id" : ObjectId("5f5c16b56058f7417f0b10fb"),
"name" : "Bob",
"age" : 30,
"sex" : "male"
}
2.2 比较查询
使用比较操作符进行查询,如下语句表示查询年龄大于25的用户:
db.user.find({age:{ $gt: 25 }})
其他比较操作符包括 $lt 小于、$lte小于等于、$ne 不等于等。下面是一个比较查询的示例:
db.user.find({age:{ $lt: 30, $gte: 20 }})
查询结果如下:
{
"_id" : ObjectId("5f5c16b56058f7417f0b10f9"),
"name" : "Jack",
"age" : 20,
"sex" : "male"
}
{
"_id" : ObjectId("5f5c16b56058f7417f0b10fb"),
"name" : "Bob",
"age" : 30,
"sex" : "male"
}
2.3 逻辑查询
在MongoDB中,可以使用逻辑操作符进行复杂查询。逻辑操作符包括 $and、$or、$not、$nor。
如下语句表示查询性别为男且年龄大于等于25的用户:
db.user.find({$and:[{sex:"male"},{age:{ $gte: 25 }}]})
下面是一个逻辑查询的示例:
db.user.find({$or:[{sex:"male"},{age:{$lt:25}}]})
查询结果如下:
{
"_id" : ObjectId("5f5c16b56058f7417f0b10f9"),
"name" : "Jack",
"age" : 20,
"sex" : "male"
}
{
"_id" : ObjectId("5f5c16b56058f7417f0b10fb"),
"name" : "Bob",
"age" : 30,
"sex" : "male"
}
{
"_id" : ObjectId("5f5c16b56058f7417f0b10fa"),
"name" : "Alice",
"age" : 25,
"sex" : "female"
}
2.4 嵌套查询
MongoDB的文档支持嵌套结构,可以使用点操作符进行嵌套查询。
如下语句表示查询家乡为北京的用户:
db.user.find({"address.hometown": "北京"})
下面是一个嵌套查询的示例:
db.user.insertOne({
"name": "David",
"age": 35,
"address": {
"hometown": "上海",
"city": "上海"
}
})
db.user.find({"address.city": "上海"})
查询结果如下:
{
"_id" : ObjectId("5f5c2e895bbfe845a9fa5e76"),
"name" : "David",
"age" : 35,
"address" : {
"hometown" : "上海",
"city" : "上海"
}
}
2.5 正则表达式查询
在MongoDB中,可以使用正则表达式进行模糊查询。
如下语句表示查询名字中包含字母o的用户:
db.user.find({name:/.*o.*/})
下面是一个正则表达式查询的示例:
db.user.find({name:/^J.*/})
查询结果如下:
{
"_id" : ObjectId("5f5c16b56058f7417f0b10f9"),
"name" : "Jack",
"age" : 20,
"sex" : "male"
}
2.6 聚合查询
在MongoDB中,可以使用聚合查询进行统计分析。
如下语句表示对年龄进行分组统计:
db.user.aggregate([{$group:{_id:"$age",count:{$sum:1}}}])
下面是一个聚合查询的示例:
db.user.aggregate([
{$match:{age:{$gt:20}}},
{$group:{_id:"$sex",count:{$sum:1}}}
])
查询结果如下:
{
"_id" : "male",
"count" : 2
}
{
"_id" : "female",
"count" : 1
}
2.7 模糊查询
在MongoDB中,可以使用 $in、$nin 操作符进行模糊查询。
如下语句表示查询名字为Jack、Alice、Bob的用户:
db.user.find({name:{$in:["Jack", "Alice", "Bob"]}})
下面是一个模糊查询的示例:
db.user.find({name:{$nin:["David", "Mike"]}})
查询结果如下:
{
"_id" : ObjectId("5f5c16b56058f7417f0b10f9"),
"name" : "Jack",
"age" : 20,
"sex" : "male"
}
{
"_id" : ObjectId("5f5c16b56058f7417f0b10fa"),
"name" : "Alice",
"age" : 25,
"sex" : "female"
}
{
"_id" : ObjectId("5f5c16b56058f7417f0b10fb"),
"name" : "Bob",
"age" : 30,
"sex" : "male"
}
3. 总结
MongoDB提供了多种查询方法,包括基本查询、比较查询、逻辑查询、嵌套查询、正则表达式查询、聚合查询和模糊查询等。熟练掌握这些查询方法,将有助于更高效地处理数据。