MongoDB是一种文档数据库,旨在使开发人员能够轻松地使用任何编程语言处理任何形式的数据。无论您是刚刚启动第一个MongoDB Atlas集群,还是经验丰富的资深用户,我们都为您准备了最佳实用示例,以更新您的知识或帮助您熟悉环境。如有需要,请查阅官方文档以深入了解所有这些主题。
文档数据结构化
MongoDB文档以BSON(扩展的二进制JSON形式)格式化,这使您在结构化所有类型的数据方面具有极高的灵活性。以下是一些您可以用来结构化文档的方式。
存储嵌套数据结构
文档数据库最强大的特性之一是能够在文档内部嵌套对象。在MongoDB中结构化数据的一个良好经验法则是,除非有充分的理由(例如需要存储无界列表的项目或需要在获取父文档之前直接查找对象),否则应优先在文档内部嵌入数据,而不是将其拆分为单独的集合。
{_id: ObjectId("5effaa5662679b5af2c58829"),
email: “[email protected]”,
name: {given: “Jesse”, family: “Xiao”},
age: 31,
addresses: [{label: “home”,
street: “101 Elm Street”,
city: “Springfield”,
state: “CA”,
zip: “90000”,
country: “US”},
{label: “mom”,
street: “555 Main Street”,
city: “Jonestown”,
province: “Ontario”,
country: “CA”}]
}
请注意,名称字段是一个包含姓氏和名字组件的嵌套对象,而地址字段存储一个包含多个地址的数组。每个地址可以有不同的字段,这使得存储不同类型的数据变得容易。
使用MongoDB Shell
MongoDB Shell是一个强大的工具,用于导航、检查甚至操作文档数据。如果您在本地机器上运行MongoDB,只需输入mongo并按回车键即可启动Shell,这将连接到本地主机的默认端口(27017)。如果您要连接到MongoDB Atlas集群或其他远程实例,请在mongo命令后添加连接字符串。
以下是一些快速Shell示例
列出数据库
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
my_database 0.004GB
>
列出集合
> use my_database;
> show collections;
users
posts
>
计算集合中的文档数
> use my_database;
> db.users.count()
20234
>
查找集合中的第一个文档
> db.users.findOne()
{
"_id": ObjectId("5ce45d7606444f199acfba1e"),
"name": {given: "Alex", family: "Smith"},
"email": "[email protected]"
"age": 27
}
>
通过ID查找文档
> db.users.findOne({_id: ObjectId("5ce45d7606444f199acfba1e")})
{
"_id": ObjectId("5ce45d7606444f199acfba1e"),
"name": {given: "Alex", family: "Smith"},
"email": "[email protected]",
"age": 27
}
>
查询MongoDB集合
MongoDB查询语言(MQL)使用与文档相同的语法,这使得即使是高级查询也非常直观且易于使用。让我们看看一些MongoDB查询示例。
查找有限数量的结果
> db.users.find().limit(10)
…
>
按姓氏查找用户
> db.users.find({"name.family": "Smith"}).count()
1
>
请注意,我们将“name.family”用引号括起来,因为它中间有一个点。
按数字范围查询文档
// All posts having “likes” field with numeric value greater than one:
> db.post.find({likes: {$gt: 1}})
// All posts having 0 likes
> db.post.find({likes: 0})
// All posts that do NOT have exactly 1 like
> db.post.find({likes: {$ne: 1}})
按字段排序结果
// order by age, in ascending order (smallest values first)
> db.user.find().sort({age: 1})
{
"_id": ObjectId("5ce45d7606444f199acfba1e"),
"name": {given: "Alex", family: "Smith"},
"email": "[email protected]",
"age": 27
}
{
_id: ObjectId("5effaa5662679b5af2c58829"),
email: “[email protected]”,
name: {given: “Jesse”, family: “Xiao”},
age: 31
}
>
// order by age, in descending order (largest values first)
> db.user.find().sort({age: -1})
{
_id: ObjectId("5effaa5662679b5af2c58829"),
email: “[email protected]”,
name: {given: “Jesse”, family: “Xiao”},
age: 31
}
{
"_id": ObjectId("5ce45d7606444f199acfba1e"),
"name": {given: "Alex", family: "Smith"},
"email": "[email protected]",
"age": 27
}
>
管理索引
MongoDB允许您创建索引,包括子文档中的嵌套字段索引,以保持查询性能,即使集合非常大。
创建索引
> db.user.createIndex({"name.family": 1})
Create a Unique Index
> db.user.createIndex({email: 1}, {unique: true})
唯一索引允许您确保集合中最多只有一个记录具有该字段的给定值——这对于像电子邮件地址这样的东西非常有用!
查看集合上的索引
> db.user.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "my_database.user"
},
{
"v" : 2,
"key" : {
"name.given" : 1
},
"name" : "name.given_1",
"ns" : "my_database.user"
}
]
请注意,默认情况下,集合总是具有_id字段的索引,以便通过主键轻松检索文档,因此任何额外的索引都将在此之后列出。
删除索引
> db.user.dropIndex("name.given_1")
结论
MongoDB的终极灵活性意味着这远远不是一个详尽的列表,您可以用它做所有的事情!有关更多信息,请访问MongoDB文档,或参加MongoDB大学的课程。
相关内容
- MongoDB大学课程 - M201:MongoDB性能
- 如何在MongoDB中创建数据库
- MongoDB中的文档嵌入
- MongoDB中的复制是什么?
- 在MongoDB中使用ACID事务
- MEAN堆栈是什么?