BeginnersBook-MongoDB-教程-一-
BeginnersBook MongoDB 教程(一)
MongoDB 插入文档
原文: https://beginnersbook.com/2017/09/mongodb-insert-document/
在本教程中,我们将了解如何将文档插入集合中。我们将在多个示例的帮助下理解这一点。
将文档插入集合的语法:
db.collection_name.insert()
让我们举一个例子来理解这一点。
MongoDB 使用insert()
插入文档示例
这里我们将文档插入名为beginnersbook
的集合中。下面示例中的字段course
是一个包含多个键值对的数组。
db.beginnersbook.insert(
{
name: "Chaitanya",
age: 30,
email: "[email protected]",
course: [ { name: "MongoDB", duration: 7 }, { name: "Java", duration: 30 } ]
}
)
您应该看到一条成功的写消息,如下所示:
WriteResult({ "nInserted" : 1 })
如果集合不存在,则
insert()
方法创建集合,但如果集合存在,则将文档插入其中
验证:
您还可以通过键入以下命令验证文档是否已成功插入:
db.collection_name.find()
在上面的示例中,我们将文档插入名为beginnersbook
的集合中,因此命令应为:
> db.beginnersbook.find()
{ "_id" : ObjectId("59bce797668dcce02aaa6fec"), "name" : "Chaitanya", "age" : 30,
"email" : "[email protected]", "course" : [ { "name" : "MongoDB",
"duration" : 7 }, { "name" : "Java", "duration" : 30 } ] }
MongoDB 示例:在集合中插入多个文档
要在集合中插入多个文档,我们定义一个文档数组,稍后我们在数组变量上使用insert()
方法,如下例所示。这里我们在名为students
的集合中插入三个文档。此命令将在students
集合中插入数据,如果集合不存在,则它将创建集合并插入这些文档。
var beginners =
[
{
"StudentId" : 1001,
"StudentName" : "Steve",
"age": 30
},
{
"StudentId" : 1002,
"StudentName" : "Negan",
"age": 42
},
{
"StudentId" : 3333,
"StudentName" : "Rick",
"age": 35
},
];
db.students.insert(beginners);
你会看到这个输出:
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
如您所见,它在nInserted
前面显示数字 3。这意味着此命令已插入 3 个文档。
验证文档是否在集合中。运行此命令:
db.students.find()
你知道吗? 您可以以 JSON 格式打印输出数据,以便您可以轻松阅读。要以 JSON 格式打印数据,请运行命令
db.collection_name.find().forEach(printjson)
所以在我们的例子中命令是这样的:
db.students.find().forEach(printjson)
在下面的屏幕截图中,您可以看到差异。首先,我们使用普通的find()
方法打印文档,然后使用 JSON 格式打印相同集合的文档。 JSON 格式的文档简洁易读。
我们还可以使用 MongoDB 2.6 中引入的 New Bulk API 插入多个文档。我们将在 Bulk API 教程中了解到这一点。
MongoDB 使用find()
方法查询文档
原文: https://beginnersbook.com/2017/09/mongodb-query-document-using-find-method/
在我之前的教程中,我使用find()
方法查询集合中的所有文档。在本教程中,我们将看到find()
方法的用法,以根据给定的条件查询集合中的文档。让我们开始吧。
以 JSON 格式查询所有文档
假设我们在名为beginnersbookdb
的数据库中有一个集合students
。要获取所有文档,我们使用此命令:
db.students.find()
但是,我们获得的输出不是任何格式且不太可读。为了提高可读性,我们可以使用以下命令格式化 JSON 格式的输出:
db.students.find().forEach(printjson);
或者只是使用pretty()
- 它做同样的事情。
db.students.find().pretty()
正如您在下面的屏幕截图中看到的那样,文档是 JSON 格式的。
根据条件查询文档
我们可以根据条件获取所选文档,而不是从集合中获取所有文档。
相等判断:
例如:我想从学生集合中获取"Steve"
的数据。这个命令应该是:
db.students.find({StudentName : "Steve"}).pretty()
此命令返回与给定条件匹配的文档。
大于判断:
语法:
db.collection_name.find({"field_name":{$gt:criteria_value}}).pretty()
例如:我想获取年龄> 32
的学生的详细信息,那么查询应该是:
db.students.find({"age":{$gt:32}}).pretty()
我有两个符合条件的文档,如下面的屏幕截图所示:
小于判断:
语法:
db.collection_name.find({"field_name":{$lt:criteria_value}}).pretty()
示例:查找 ID 小于 3000 的所有学生。此判断的命令为:
db.students.find({"StudentId":{$lt:3000}}).pretty()
输出:
> db.students.find({"StudentId":{$lt:3000}}).pretty()
{
"_id" : ObjectId("59bcecc7668dcce02aaa6fed"),
"StudentId" : 1001,
"StudentName" : "Steve",
"age" : 30
}
{
"_id" : ObjectId("59bcecc7668dcce02aaa6fee"),
"StudentId" : 1002,
"StudentName" : "Negan",
"age" : 42
}
不等于判断:
语法:
db.collection_name.find({"field_name":{$ne:criteria_value}}).pretty()
示例:查找 id 不等于 1002 的所有学生。此条件的命令为:
db.students.find({"StudentId":{$ne:1002}}).pretty()
判断:
> db.students.find({"StudentId":{$ne:1002}}).pretty()
{
"_id" : ObjectId("59bcecc7668dcce02aaa6fed"),
"StudentId" : 1001,
"StudentName" : "Steve",
"age" : 30
}
{
"_id" : ObjectId("59bcecc7668dcce02aaa6fef"),
"StudentId" : 3333,
"StudentName" : "Rick",
"age" : 35
}
以下是另外两个判断:
大于等于判断:
db.collection_name.find({"field_name":{$gte:criteria_value}}).pretty()
小于等于判断:
db.collection_name.find({"field_name":{$lte:criteria_value}}).pretty()
我们在所有命令末尾添加的
pretty()
方法不是必需的。它仅用于格式化目的。
MongoDB - 更新集合中的文档
原文: https://beginnersbook.com/2017/09/mongodb-update-document/
在 MongoDB 中,我们有两种方法来更新集合中的文档。1)update()
方法,2)save()
方法。虽然这两种方法都更新了现有文档,但它们正在不同的场景中使用。当我们需要更新现有文档的值时使用update()
方法,而save()
方法用于将现有文档替换为已在其中传递的文档。
要更新 MongoDB 中的文档,我们在命令中提供条件,并更新与该条件匹配的文档。要了解标准在 MongoDB 命令中的工作方式,请参阅上一个教程: MongoDB 查询文档
使用update()
方法更新文档
语法:
db.collection_name.update(criteria, update_data)
示例:
例如:假设我在数据库beginnersbookdb
中有一个名为got
的集合。got
里面的文档是:
> db.got.find().pretty()
{
"_id" : ObjectId("59bd2e73ce524b733f14dd65"),
"name" : "Jon Snow",
"age" : 32
}
{
"_id" : ObjectId("59bd2e8bce524b733f14dd66"),
"name" : "Khal Drogo",
"age" : 36
}
{
"_id" : ObjectId("59bd2e9fce524b733f14dd67"),
"name" : "Sansa Stark",
"age" : 20
}
{
"_id" : ObjectId("59bd2ec5ce524b733f14dd68"),
"name" : "Lord Varys",
"age" : 42
}
现在假设我想更新名为“Kit Harington”的 Jon Snow 的名字。对此的命令是:
db.got.update({"name":"Jon Snow"},{$set:{"name":"Kit Harington"}})
输出:
如您所见,该文档已更新。
你知道吗? 默认情况下,更新方法更新单个文档。在上面的示例中,我们只有一个文档与条件匹配,但是如果有更多文档,那么也只会更新一个文档。要启用 update()方法来更新多个文档,您必须将此方法的“multi”参数设置为 true,如下所示。
使用 update()方法更新多个文档:
db.got.update({"name":"Jon Snow"},
{$set:{"name":"Kit Harington"}},{multi:true})
使用 save()方法更新文档
语法:
db.collection_name.save( {_id:ObjectId(), new_document} )
让我们采用我们在上面看到的相同的例子。现在我们要将Kit Harington
的名称更新为Jon Snow
。要使用save()
方法,您应该知道该文档的唯一_id
字段。
一个非常重要的注意事项是当你在使用
save()
方法时不提供_id
字段时,它调用insert()
方法并插入传递的文档作为新文档进入集合
要获取文档的_id
,可以键入以下命令:
db.got.find().pretty()
这里有一个集合名称。这种查找唯一_id
的方法仅在您拥有少量文档时才有用,否则在大量文档中滚动和搜索该_id
是很繁琐的。
如果您有大量文档,那么要获取特定文档的_id
,请使用find()
方法中的条件。例如:要使用save()
方法获取要更新的文档的_id
,请键入以下命令:
> db.got.find({"name": "Kit Harington"}).pretty()
{
"_id" : ObjectId("59bd2e73ce524b733f14dd65"),
"name" : "Kit Harington",
"age" : 32
}
现在我们知道该文档的唯一_id
字段。让我们使用save()
方法编写命令。
> db.got.save({"_id" : ObjectId("59bd2e73ce524b733f14dd65"), "name":
"Jon Snow", "age": 30})
>
你应该看到这个输出:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
验证更新:
MongoDB 从集合中删除文档
原文: https://beginnersbook.com/2017/09/mongodb-delete-document/
在本教程中,我们将学习如何从集合中删除文档。remove()
方法用于从 MongoDB 中的集合中删除文档。
remove()
方法的语法:
db.collection_name.remove(delete_criteria)
要了解如何在 MongoDB 命令中指定条件,请参阅本教程: MongoDB 查询文档。
使用remove()
方法删除文档
假设我的 MongoDB 数据库中有一个名为beginnersbookdb
的集合students
。 students
集合中的文档是:
> db.students.find().pretty()
{
"_id" : ObjectId("59bcecc7668dcce02aaa6fed"),
"StudentId" : 1001,
"StudentName" : "Steve",
"age" : 30
}
{
"_id" : ObjectId("59bcecc7668dcce02aaa6fef"),
"StudentId" : 3333,
"StudentName" : "Rick",
"age" : 35
}
现在我想删除这个学生 ID 等于 3333 的学生。要做到这一点,我会使用remove()
方法编写一个命令,如下所示:
db.students.remove({"StudentId": 3333})
输出:
WriteResult({ "nRemoved" : 1 })
验证文档是否实际删除。键入以下命令:
db.students.find().pretty()
它将列出学生集合的所有文档。
以下是上述所有步骤的屏幕截图:
如何只删除一个符合条件的文档?
当集合中存在多个符合条件的文档时,如果运行remove
命令,则将删除所有这些文档。但是,有一种方法可以将删除限制为仅一个文档,这样即使有更多文档符合删除条件,也只会删除一个文档。
db.collection_name.remove(delete_criteria, justOne)
这里justOne
是一个布尔参数,只取 1 和 0,如果你给 1,那么它会将文档删除限制为只有 1 个文档。这是一个可选参数,如上所述,我们使用remove()
方法而不使用此参数。
例如,我在集合中有以下记录。
> db.walkingdead.find().pretty()
{
"_id" : ObjectId("59bf280cb8e797a22c654229"),
"name" : "Rick Grimes",
"age" : 32,
"rname" : "Andrew Lincoln"
}
{
"_id" : ObjectId("59bf2851b8e797a22c65422a"),
"name" : "Negan",
"age" : 35,
"rname" : "Jeffrey Dean Morgan"
}
{
"_id" : ObjectId("59bf28a5b8e797a22c65422b"),
"name" : "Daryl Dixon",
"age" : 32,
"rname" : "Norman Reedus"
}
假设我想删除年龄等于 32 的文档。此集合中有两个文档符合此条件。但是,为了将删除限制为 1,我们将justOne
参数设置为true
。
db.walkingdead.remove({"age": 32}, 1)
输出:如您所见,只有一个文档被删除。
WriteResult({ "nRemoved" : 1 })
删除所有文档
如果要从集合中删除所有文档但不想删除集合本身,则可以使用remove()
方法,如下所示:
db.collection_name.remove({})
如果您想删除该集合以及所有文档,请参阅本指南:MongoDB 删除集合
MongoDB 投影
在之前的教程中,我们学习了如何在查询文档时使用条件来从集合中获取所选文档。在本教程中,我们将学习 MongoDB 的另一个有趣话题,即 MongoDB 投影。当我们想要获取文档的选定字段而不是所有字段时使用。
例如,我们有一个集合,其中存储了包含以下字段的文档:student_name
,student_id
,student_age
但我们只想查看所有学生的student_id
,那么在这种情况下我们可以使用投影来获取student_id
。
语法:
db.collection_name.find({},{field_key:1 or 0})
现在不要担心语法,我们将看到一个例子来理解这一点。
MongoDB 投影示例
让我们举一个例子来理解 MongoDB 中的投影。我们有一个名为studentdata
的集合,其中包含以下文档。
> db.studentdata.find().pretty()
{
"_id" : ObjectId("59bf63380be1d7770c3982af"),
"student_name" : "Steve",
"student_id" : 2002,
"student_age" : 22
}
{
"_id" : ObjectId("59bf63500be1d7770c3982b0"),
"student_name" : "Carol",
"student_id" : 2003,
"student_age" : 22
}
{
"_id" : ObjectId("59bf63650be1d7770c3982b1"),
"student_name" : "Tim",
"student_id" : 2004,
"student_age" : 23
}
要仅获取所有文档的 student_id,我们将使用以下投影:
> db.studentdata.find({}, {"_id": 0, "student_id": 1})
{ "student_id" : 2002 }
{ "student_id" : 2003 }
{ "student_id" : 2004 }
值 1 表示显示字段,0 表示不显示该字段。当我们在投影中将字段设置为 1 时,除了
_id
之外,其他字段会自动设置为 0,因此为了避免_id
,我们需要在投影中将其专门设置为 0。反之亦然,当我们将少数字段设置为 0,其他字段自动设置为 1 时(参见下面的示例)
另一种做同样事情的方法:
> db.studentdata.find({}, {"_id": 0, "student_name": 0, "student_age": 0})
{ "student_id" : 2002 }
{ "student_id" : 2003 }
{ "student_id" : 2004 }
重要提示:
有些人在查询中使用投影时可能会收到此错误:
Error: error: {
"ok" : 0,
"errmsg" : "Projection cannot have a mix of inclusion and exclusion.",
"code" : 2,
"codeName" : "BadValue"
}
当您将某些字段设置为 0 而其他字段设置为 1 时会发生这种情况,换句话说,您将混合包含和排除组合在一起,唯一的例外是_id
字段。例如:以下查询将产生此错误:
db.studentdata.find({}, {"_id": 0, "student_name": 0, "student_age": 1})
这是因为我们将student_name
设置为 0,将其他字段student_age
设置为 1。我们不能混用这些。您可以将不想显示的字段设置为 0,或将字段设置为 1 以显示。
MongoDB - limit()
和skip()
方法
原文: https://beginnersbook.com/2017/09/mongodb-limit-and-skip-method/
在本教程中,我们将学习如何在 MongoDB 查询中使用limit()
和skip()
方法。
MongoDB 中的limit()
方法
此方法限制响应特定查询而返回的文档数。
语法:
db.collection_name.find().limit(number_of_documents)
让我们举一个例子来了解如何使用这种方法。可以说,我有一个集合studentdata
,其中包含以下文档:
> db.studentdata.find().pretty()
{
"_id" : ObjectId("59bf63380be1d7770c3982af"),
"student_name" : "Steve",
"student_id" : 2002,
"student_age" : 22
}
{
"_id" : ObjectId("59bf63500be1d7770c3982b0"),
"student_name" : "Carol",
"student_id" : 2003,
"student_age" : 22
}
{
"_id" : ObjectId("59bf63650be1d7770c3982b1"),
"student_name" : "Tim",
"student_id" : 2004,
"student_age" : 23
}
让我们说我想找出所有ID > 2002
的学生的名单,我会用一个判断写一个这样的查询:
要了解在查询文档时如何指定条件,请阅读: MongoDB 查询文档
db.studentdata.find({student_id : {$gt:2002}}).pretty()
使用limit()
方法限制结果中的文档:
让我说我不希望所有符合条件的文档。我只想选择一些文档,然后我可以使用limit()
方法来限制文档的数量。例如,如果我只想输出一个文档,那么我会这样做:
> db.studentdata.find({student_id : {$gt:2002}}).limit(1).pretty()
{
"_id" : ObjectId("59bf63500be1d7770c3982b0"),
"student_name" : "Carol",
"student_id" : 2003,
"student_age" : 22
}
MongoDB skip()
方法
skip()
方法用于在查询结果中跳过给定数量的文档。
要理解skip()
方法的使用,让我们采用上面我们看到的相同示例。在上面的例子中,我们可以看到,通过使用limit(1)
,我们设法只获得一个文档,这是第一个与给定条件匹配的文档。如果您不希望第一个文档符合您的条件,该怎么办?例如,我们有两个文档,其student_id
值大于 2002 但是当我们使用limit(1)
将结果限制为 1 时,我们得到了第一个文档,为了得到符合此条件的第二个文档,我们可以使用skip(1)
,这里将跳过第一份文档。
不使用skip()
:
> db.studentdata.find({student_id : {$gt:2002}}).limit(1).pretty()
{
"_id" : ObjectId("59bf63500be1d7770c3982b0"),
"student_name" : "Carol",
"student_id" : 2003,
"student_age" : 22
}
使用skip
:
> db.studentdata.find({student_id : {$gt:2002}}).limit(1).skip(1).pretty()
{
"_id" : ObjectId("59bf63650be1d7770c3982b1"),
"student_name" : "Tim",
"student_id" : 2004,
"student_age" : 23
}
MongoDB sort()
方法
在本教程中,我们将学习如何使用sort()
方法对文档进行排序。
使用sort()
方法对文档进行排序
使用sort()
方法,您可以根据文档的特定字段按升序或降序对文档进行排序。
sort()
方法的语法:
db.collecttion_name.find().sort({field_key:1 or -1})
1 表示升序,-1 表示降序。默认值为 1。
例如:集合studentdata
包含以下文档:
> db.studentdata.find().pretty()
{
"_id" : ObjectId("59bf63380be1d7770c3982af"),
"student_name" : "Steve",
"student_id" : 2002,
"student_age" : 22
}
{
"_id" : ObjectId("59bf63500be1d7770c3982b0"),
"student_name" : "Carol",
"student_id" : 2003,
"student_age" : 22
}
{
"_id" : ObjectId("59bf63650be1d7770c3982b1"),
"student_name" : "Tim",
"student_id" : 2004,
"student_age" : 23
}
假设我想以降序显示所有文档的student_id
:
要仅显示特定的文档字段,我使用的是 MongoDB 投影
> db.studentdata.find({}, {"student_id": 1, _id:0}).sort({"student_id": -1})
{ "student_id" : 2004 }
{ "student_id" : 2003 }
{ "student_id" : 2002 }
要以升序显示所有学生的student_id
字段:
> db.studentdata.find({}, {"student_id": 1, _id:0}).sort({"student_id": 1})
{ "student_id" : 2002 }
{ "student_id" : 2003 }
{ "student_id" : 2004 }
默认值:默认为升序,所以如果我在sort()
方法中没有提供任何值,那么它将按升序对记录进行排序,如下所示:
> db.studentdata.find({}, {"student_id": 1, _id:0}).sort({})
{ "student_id" : 2002 }
{ "student_id" : 2003 }
{ "student_id" : 2004 }
您还可以根据您不想显示的字段对文档进行排序:例如,您可以根据student_id
对文档进行排序,并显示student_age
和student_name
字段。
MongoDB 索引教程
原文: https://beginnersbook.com/2017/09/mongodb-indexing-tutorial-with-example/
MongoDB 中的索引是一种特殊的数据结构,它保存创建索引的少量文档字段的数据。索引提高了数据库中搜索操作的速度,因为不是搜索整个文档,而是对仅包含少量字段的索引执行搜索。另一方面,由于索引使用了额外的写入和额外数据空间,索引太多会妨碍插入,更新和删除操作的性能。
如何在 MongoDB 中创建索引
语法:
db.collection_name.createIndex({field_name: 1 or -1})
值 1 表示升序,-1 表示降序。
例如,我有一个集合studentdata
。此集合中的文档包含以下字段:student_name
,student_id
和student_age
假设我想按升序在student_name
字段上创建索引:
db.studentdata.createIndex({student_name: 1})
输出:
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
我们在student_name
上创建了索引,这意味着当有人根据student_name
搜索文档时,搜索速度会更快,因为索引将用于此搜索。因此,在字段中创建将在集合中频繁搜索的索引非常重要。
MongoDB - 查找集合中的索引
我们可以使用getIndexes()
方法来查找在集合上创建的所有索引。此方法的语法是:
db.collection_name.getIndexes()
因此,要获取studentdata
集合的索引,命令将是:
> db.studentdata.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.studentdata"
},
{
"v" : 2,
"key" : {
"student_name" : 1
},
"name" : "student_name_1",
"ns" : "test.studentdata"
}
]
输出显示我们在此集合中有两个索引。在_id
上创建的默认索引以及我们在student_name
字段上创建的索引。
MongoDB - 删除集合中的索引
您可以删除特定索引或所有索引。
删除特定索引:
为此,使用了dropIndex()
方法。
db.collection_name.dropIndex({index_name: 1})
让我们删除我们在集合studentdata
中的student_name
字段上创建的索引。这个命令:
db.studentdata.dropIndex({student_name: 1})
nIndexesWas
:显示执行此命令之前有多少索引
ok: 1
:表示命令执行成功。
删除所有索引:
要删除集合的所有索引,我们使用dropIndexes()
方法。
dropIndexs()
方法的语法:
db.collection_name.dropIndexes()
假设我们想要删除studentdata
集合的所有索引。
db.studentdata.dropIndexes()
消息“为集合删除的非_id
索引”表示默认索引_id
仍将保留,不能删除。这意味着使用此方法我们只能删除我们创建的索引,我们不能删除在_id
字段上创建的默认索引。
NoSQL 数据库简介
原文: https://beginnersbook.com/2017/09/introduction-to-nosql/
数据库管理系统提供存储和检索数据的机制。有不同种类的数据库管理系统:
- RDBMS(关系数据库管理系统)
- OLAP(在线分析处理)
- NoSQL(不仅是 SQL)
在本指南中,我们将讨论 NoSQL。 NoSQL 数据库的创建是为了克服关系数据库的局限性。
什么是 NoSQL 数据库?
NoSQL 数据库与 MQSql 等关系数据库不同。在关系数据库中,您需要创建表,定义模式,设置字段的数据类型等,然后才能实际插入数据。在 NoSQL 中你不必担心,你可以动态插入,更新数据。
NoSQL 数据库的一个优点是它们非常容易扩展,并且它们在我们在数据库上执行的大多数类型的操作中要快得多。在某些情况下,您更喜欢关系数据库而不是 NoSQL,但是当您处理大量数据时,NoSQL 数据库是您的最佳选择。
关系数据库的局限性
-
在关系数据库中,我们需要首先定义数据的结构和模式,然后才能处理数据。
-
关系数据库系统通过强制执行 ACID 属性(原子性,一致性,隔离性和持久性)来提供数据的一致性和完整性。在某些情况下,这有点像银行系统一样有用。但是,在大多数其他情况下,这些属性是显着的性能开销,并且可能使您的数据库响应非常慢。
-
大多数应用以 JSON 格式存储数据,而 RDBMS 不为您提供更好的方法来对此数据执行创建,插入,更新,删除等操作。另一方面,NoSQL 以 JSON 格式存储数据,这与当今世界的大多数应用兼容。
NoSQL 的优点是什么?
使用 NoSQL 数据库(如 MongoDB 和 Cassandra)有几个优点。主要优点是高可扩展性和高可用性。
高可扩展性: NoSQL 数据库(如 MongoDB)使用分片进行水平扩展。分片是对数据进行分区并将其放置在多台机器上,以保持数据的顺序。垂直扩展意味着向现有机器添加更多资源,而水平扩展意味着添加更多机器来处理数据。垂直缩放并不容易实现,另一方面,水平缩放很容易实现。水平扩展数据库示例:MongoDB,Cassandra 等。由于此功能,NoSQL 可以处理大量数据,因为数据增长 NoSQL 扩展自身以高效处理该数据。
高可用性: MongoDB 中的自动复制功能使其具有高可用性,因为如果发生任何故障,数据会将自身复制到先前的一致状态。
NoSQL 数据库的类型
以下是 NoSQL 数据库的类型以及属于该类别的数据库系统的名称。 MongoDB 属于基于 NoSQL 文档的数据库类别。
- 键值存储:Memcached,Redis,Coherence
- 表:Hbase,Big Table,Accumulo
- 基于文档:MongoDB,CouchDB ,Cloudant
RDBMS 与 NoSQL
RDBMS:它是一种结构化数据,提供更多功能但性能更低。
NoSQL:结构化或半结构化数据,功能更少,性能更高。
所以当我在 NoSQL 中说较少的功能时缺少什么:
- NoSQL 中没有约束
- NoSQL 不支持连接
这些支持实际上阻碍了数据库的可伸缩性,因此在使用像 MongoDB 这样的 NoSQL 数据库时,可以在应用中实现这些功能水平。
什么时候去 NoSQL
当您想要在关系数据库上选择 NoSQL 时:
- 当您想要存储和检索大量数据时。
- 您存储的数据之间的关系并不重要
- 数据不是结构化的,而是随着时间而变化
- 数据库级别不需要约束和联接支持
- 数据不断增长,您需要定期扩展数据库以处理数据。
MongoDB 简介
原文: https://beginnersbook.com/2017/09/introduction-to-mongodb/
MongoDB 是一个面向文档的开源数据库,它以文档(键和值对)的形式存储数据。正如我们上一篇教程(NoSQL 介绍)中所讨论的那样,基于文档的数据库是 NoSQL 数据库的一种类型。
什么是文档?
如果您来自关系数据库背景,那么您可以将它们视为 RDBMS 中的行。关系数据库和 MongoDB 之间的映射将在下一个教程中介绍,所以如果你想知道 MongoDB 中的行,表,列的等价物,你一定要检查它:将关系数据库映射到 MongoDB 。
{
name: "Chaitanya",
age: 30,
website: "beginnersbook.com",
hobbies: ["Teaching", "Watching TV"]
}
这是 JSON 之类的结构。数据以键和值对的形式存储的位置。
MongoDB 的历史
MongoDB 是由 Eliot 和 Dwight(DoubleClick 的创始人)于 2007 年创建的,当时他们在使用关系数据库时遇到了可扩展性问题。开发 MongoDB 的组织最初称为 10gen。
2009 年 2 月,他们改变了商业模式,并将 MongoDB 作为开源项目发布。该组织于 2013 年更名,现称为 MongoDB Inc。
MongoDB 的功能
- MongoDB 提供高性能。与关系数据库相比,MongoDB 中的大多数操作都更快。
- MongoDB 提供自动复制功能,允许您在发生故障时快速恢复数据。
- 由于共享,MongoDB 中可以进行水平缩放。分片是对数据进行分区并将其放置在多台机器上,以保持数据的顺序。
水平缩放与垂直缩放:
垂直缩放意味着向现有机器添加更多资源,而水平缩放意味着添加更多机器来处理数据。垂直缩放并不容易实现,另一方面,水平缩放很容易实现。水平扩展数据库示例:MongoDB,Cassandra 等
- 负载均衡:水平扩展允许 MongoDB 平衡负载。
- 高可用性:自动复制提高了 MongoDB 数据库的可用性。
- 索引:索引是文档中的单个字段。索引用于快速定位数据,而无需搜索 MongoDB 数据库中的每个文档。这提高了在 MongoDB 数据库上执行的操作的性能。
将关系数据库映射到 MongoDB
原文: https://beginnersbook.com/2017/09/mapping-relational-databases-to-mongodb/
如果您来自关系数据库背景,那么您可能很难将 RDBMS 术语与 MongoDB 相关联。在本指南中,我们将看到关系数据库和 MongoDB 之间的映射。
将关系数据库映射到 MongoDB
MongoDB 中的集合等同于 RDBMS 中的表。
MongoDB 中的文档等同于 RDBMS 中的行。
MongoDB 中的字段等同于 RDBMS 中的列。
字段(键和值对)存储在文档中,文档存储在集合中,集合存储在数据库中。
这是文档在 MongoDB 中的样子:正如您所看到的,这与 RDBMS 中的行类似。唯一的区别是它们是 JSON 格式。
表与集合
在这里,我们将看到关系数据库中的表如何在 MongoDB 中查找。如您所见,列被表示为键值对(JSON 格式),行表示为文档。MongoDB 自动在每个文档中插入一个唯一的_id
(12 字节字段)字段,这个字段用作每个文档的主键。
关于 MongoDB 的另一个很酷的事情是它支持动态模式,这意味着集合中的一个文档可以有 4 个字段,而另一个文档只有 3 个字段。这在关系数据库中是不可能的。
如何为 Windows 安装和配置 MongoDB
原文: https://beginnersbook.com/2017/09/how-to-install-and-configure-mongodb-for-windows/
这是在 Windows 上安装 MongoDB 的完整分步指南。
在 Windows 上安装 MongoDB
步骤 1:转到 MongoDB 下载页面并单击下载,如屏幕截图所示。像这样的.msi
文件mongodb-win32-x86_64-2008plus-ssl-3.4.7-signed
将在你的系统中下载。双击该文件以运行安装程序。
步骤 2:弹出 MongoDB 安装窗口时单击“下一步”。
步骤 3:接受 MongoDB 用户协议,然后单击“下一步”。
步骤 4:当安装程序要求您选择安装类型时,选择完成。
步骤 5:单击“Install”开始安装。
第 6 步:就是这样。 MongoDB 安装完成后,单击“Finish”。
我们没有在这里完成。在开始使用 MongoDB 之前,我们需要做几个步骤。
MongoDB 配置
步骤 1 :找到已安装 MongoDB 的文件夹。如果您已按照上述步骤操作,则可以在此位置找到该文件夹:
C:\Program Files\MongoDB
在这里,您需要创建 MongoDB 配置所需的几个文件夹。
- 在此处创建两个文件夹,将它们命名为
data
和log
。 - 在
data
中创建另一个文件夹,并将其命名为db
,这是所有数据的存储位置。这就是关闭窗口。
步骤 2 :打开命令提示符(右键单击并以管理员身份运行)。导航到 MongoDB 的bin
文件夹,如屏幕截图所示。根据您安装 MongoDB 的位置,bin
文件夹的路径可能会有所不同。
步骤 3 :配置数据并通过键入此命令将日志文件夹和 MongoDB 设置为服务。注意:这是一行命令。
mongod --directoryperdb --dbpath "C:\Program Files\MongoDB\data\db"
--logpath "C:\Program Files\MongoDB\log\mongo.log" --logappend --rest --install
第 4 步:现在您可以通过输入以下命令启动 MongoDB 作为服务:
net start MongoDB
您应该看到一条消息“MongoDB 服务已成功启动”。
这就是一切都完成了。现在我们应该在 MongoDB shell 中工作,我们可以通过在bin
目录中键入此命令来运行它。
mongo
在下一个教程中,我们将学习如何在 MongoDB shell 中工作。
如果要退出 shell,可以通过键入quit()
或使用Ctrl-C
来执行此操作,然后可以使用以下命令停止 MongoDB 服务:
net stop MongoDB
在 MongoDB 中创建数据库
原文: https://beginnersbook.com/2017/09/mongodb-create-database/
在本教程中,我们将了解如何在 MongoDB 中创建和使用数据库。
MongoDB 创建数据库
键入以下命令启动 MongoDB 服务:
net start MongoDB
你应该看到这样的消息:
The MongoDB service is starting..
The MongoDB service was started successfully.
导航到 MongoDB 的bin
目录,如下面的屏幕截图所示:
现在我们应该在 MongoDB shell 中工作。要运行 MongoDB shell,请键入以下命令:
mongo
进入 MongoDB shell 后,通过键入以下命令在 MongoDB 中创建数据库:
use database_name
例如,我正在创建一个数据库beginnersbook
,所以命令应该是:
use beginnersbook
注意:如果您提到的数据库名称已存在,则此命令将连接到数据库。但是,如果数据库不存在,那么这将创建具有给定名称的数据库并将您连接到它。
在任何时候,如果要检查当前连接的数据库,只需键入命令db
。此命令将显示您当前连接的数据库名称。当您使用多个数据库时,这是非常有用的命令,因此在创建集合或在数据库中插入文档之前,您可能希望确保您位于正确的数据库中。
> db
beginnersbook
要列出所有数据库,请使用命令show dbs
。此命令列出磁盘上的所有数据库及其大小。
> show dbs
admin 0.000GB
local 0.000GB
如您所见,我们创建的数据库
beginnersbook
不存在于所有数据库的列表中。这是因为在将文档保存到数据库之前不会创建数据库
现在我们正在创建一个集合user
并在其中插入文档。
我们将在下一个教程中学习如何创建集合和文档。
> db.user.insert({name: "Chaitanya", age: 30})
WriteResult({ "nInserted" : 1 })
> show dbs
admin 0.000GB
beginnersbook 0.000GB
local 0.000GB
您现在可以看到创建了数据库beginnersbook
。
删除 MongoDB 中的数据库
原文: https://beginnersbook.com/2017/09/mongodb-drop-database/
在上一个教程中,我们学习了如何在 MongoDB 中创建数据库。在这里,我们将看到如何在 MongoDB 中删除数据库。我们使用db.dropDatabase()
命令删除数据库。删除数据库时应该非常小心,因为这将删除该数据库中的所有数据,包括存储在数据库中的集合和文档。
MongoDB 删除数据库
删除数据库的语法是:
db.dropDatabase()
我们在此命令中未指定任何数据库名称,因为此命令将删除当前选定的数据库。让我们看看在 MongoDB 中删除数据库的步骤。
- 使用
show dbs
命令查看数据库列表。
> show dbs
admin 0.000GB
beginnersbook 0.000GB
local 0.000GB
它显示了我创建的两个默认数据库和一个数据库“beginnersbook”。
- 键入以下命令切换到需要删除的数据库。
use database_name
例如,我想删除数据库beginnersbook
。
> use beginnersbook
switched to db beginnersbook
注意:将上述命令中的数据库名称从
beginnersbook
更改为需要删除的数据库。
- 现在,当前选择的数据库是
beginnersbook
,因此命令db.dropDatabase()
将删除此数据库。
> db.dropDatabase()
{ "dropped" : "beginnersbook", "ok" : 1 }
该命令成功执行并显示操作dropped
和状态ok
,这意味着数据库已被删除。
- 验证是否已成功删除数据库。再次执行
show dbs
命令以查看删除后的数据库列表。
正如您所看到的那样,数据库beginnersbook
不在列表中,这意味着它已成功删除。
在 MongoDB 中创建集合
原文: https://beginnersbook.com/2017/09/mongodb-create-collection/
我们知道 MongoDB 中的数据是以文档的形式存储的。这些文档存储在集合中,集合存储在数据库中。在上一篇教程中,我们学习了如何在 MongoDB 中创建数据库。在本指南中,我将向您展示在 MongoDB 中创建集合的两种方法。
方法 1:动态创建 MongoDB 中的集合
MongoDB 很酷的一点是,在将文档插入其中之前不需要创建集合。使用单个命令,您可以在集合中插入文档,MongoDB 即时创建该集合。
语法:db.collection_name.insert({key: value, key: value ...})
例如:我们在数据库beginnersbookdb
中没有集合beginnersbook
。此命令将动态创建名为beginnersbook
的集合,并使用指定的键和值对在其中插入文档。
> use beginnersbookdb
switched to db beginnersbookdb
db.beginnersbook.insert({
name: "Chaitanya",
age: 30,
website: "beginnersbook.com"
})
您将在命令提示符中看到此响应。
WriteResult({ "nInserted" : 1 })
要检查文档是否已成功插入,请键入以下命令。它显示给定集合中的所有文档。
语法:db.collection_name.find()
> db.beginnersbook.find()
{ "_id" : ObjectId("59bcb8c2415346bdc68a0a66"), "name" : "Chaitanya",
"age" : 30, "website" : "beginnersbook.com" }
要检查是否已成功创建集合,请使用以下命令。
show collections
此命令显示当前所选数据库中所有集合的列表。
> show collections
beginnersbook
方法 2:在插入文档之前使用选项创建集合
我们还可以在实际插入数据之前创建集合。此方法为您提供了在创建集合时可以设置的选项。
语法:
db.createCollection(name, options)
name
是集合名称,options
是一个可选字段,我们可以用它来指定集合中的某些参数,如大小,文档的最大数量等。
首先让我们看看这个命令如何用于创建没有任何参数的集合:
> db.createCollection("students")
{ "ok" : 1 }
让我们看看我们在创建集合时可以提供的选项:
capped
:类型:布尔值。
此参数仅为true
和false
。这指定了集合可以拥有的最大条目的上限。一旦集合达到该限制,它就会开始覆盖旧条目。
这里需要注意的是,当您将capped
选项设置为true
时,您还必须指定size
参数。
size
:类型:数字。
指定集合的最大大小(上限集合),以字节为单位。
max
:类型:数字。
指定集合可容纳的最大文档数。
autoIndexId
:类型:布尔值
此参数的默认值为false
。如果将其设置为true
,则会自动为每个文档创建索引字段_id
。我们将在 MongoDB 索引教程中了解索引。
让我们看一个上限集合的例子:
db.createCollection("teachers", { capped : true, size : 9232768} )
{ "ok" : 1 }
此命令将创建名为teachers
的集合,其最大大小为 9232768 字节。一旦此集合达到该限制,它将开始覆盖旧条目。
删除 MongoDB 中的集合
原文: https://beginnersbook.com/2017/09/mongodb-drop-collection/
在上一个教程中,我们学习了如何在 MongoDB 中创建集合。在本指南中,我们将了解如何在 MongoDB 中删除集合。
要删除集合,首先连接到要删除集合的数据库,然后键入以下命令以删除集合:
db.collection_name.drop()
注意:删除集合后,所有文档以及与它们关联的索引也将被删除。为了保留索引,我们使用
remove()
函数,该函数仅删除集合中的文档,但不删除集合本身及其上创建的索引。我们将在后面的教程中学习索引和remove()
函数。
MongoDB 删除集合示例
例如,我想在我的数据库beginnersbook.com
中删除集合名称teachers
。为此,我将按给定的顺序编写以下命令。
> use beginnersbookdb
switched to db beginnersbookdb
> show collections
beginnersbook
students
teachers
> db.teachers.drop()
true
> show collections
beginnersbook
students
正如您所看到的,命令db.teachers.drop()
返回true
,这意味着该集合已成功删除。我们在删除后使用show collections
命令验证了同样的事情,如上所示。