您现在的位置是:首页 >技术交流 >MongoDB教程-4网站首页技术交流
MongoDB教程-4
remove()方法
MongoDB的remove()方法用于从集合中删除文档。remove()方法接受两个参数。一个是删除标准,第二个是justOne标志。
删除标准−(可选)将删除根据文档的删除标准。
justOne−(可选)如果设置为true或1,则仅删除一个文档。
语法
remove()方法的基本语法如下−
>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
实例
考虑mycol集合具有以下数据。
{_id : ObjectId("507f191e810c19729de860e1"), title: "MongoDB Overview"},
{_id : ObjectId("507f191e810c19729de860e2"), title: "NoSQL Overview"},
{_id : ObjectId("507f191e810c19729de860e3"), title: "Tutorials Point Overview"}
以下示例将删除标题为“MongoDB Overview”的所有文档。
>db.mycol.remove({'title':'MongoDB Overview'})
WriteResult({"nRemoved" : 1})
> db.mycol.find()
{"_id" : ObjectId("507f191e810c19729de860e2"), "title" : "NoSQL Overview" }
{"_id" : ObjectId("507f191e810c19729de860e3"), "title" : "Tutorials Point Overview" }
仅删除一个
如果有多条记录,并且您只想删除第一条记录,那么在remove()方法中设置justOne参数。
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
删除所有文档
如果不指定删除条件,MongoDB将从集合中删除所有文档。这相当于SQL的truncate命令。
> db.mycol.remove({}) WriteResult({ "nRemoved" : 2 }) > db.mycol.find() >
在MongoDB中,投影意味着只选择必要的数据,而不是选择文档的全部数据。如果一个文档有5个字段,而您只需要显示3个字段,则只需从中选择3个字段。
find()方法
MongoDB的find()方法(在MongoDB查询文档中解释)接受第二个可选参数,即要检索的字段列表。在MongoDB中,当您执行find()方法时,它会显示文档的所有字段。要限制这一点,需要设置值为1或0的字段列表。1用于显示字段,而0用于隐藏字段。
语法
带有投影的find()方法的基本语法如下−
>db.COLLECTION_NAME.find({},{KEY:1})
实例
考虑集合mycol具有以下数据−
{_id : ObjectId("507f191e810c19729de860e1"), title: "MongoDB Overview"},
{_id : ObjectId("507f191e810c19729de860e2"), title: "NoSQL Overview"},
{_id : ObjectId("507f191e810c19729de860e3"), title: "Tutorials Point Overview"}
以下示例将在查询文档时显示文档的标题。
>db.mycol.find({},{"title":1,_id:0}) {"title":"MongoDB Overview"} {"title":"NoSQL Overview"} {"title":"Tutorials Point Overview"} >
请注意,在执行find()方法时始终会显示_id字段,如果您不想要此字段,则需要将其设置为0。
Limit()方法
要限制MongoDB中的记录,需要使用limit()方法。该方法接受一个数字类型参数,即要显示的文档数。
语法
limit()方法的基本语法如下−
>db.COLLECTION_NAME.find().limit(NUMBER)
实例
考虑集合myycol具有以下数据。
{_id : ObjectId("507f191e810c19729de860e1"), title: "MongoDB Overview"},
{_id : ObjectId("507f191e810c19729de860e2"), title: "NoSQL Overview"},
{_id : ObjectId("507f191e810c19729de860e3"), title: "Tutorials Point Overview"}
以下示例将在查询文档时仅显示两个文档。
>db.mycol.find({},{"title":1,_id:0}).limit(2) {"title":"MongoDB Overview"} {"title":"NoSQL Overview"} >
如果您没有在limit()方法中指定number参数,那么它将显示集合中的所有文档。
MongoDB Skip()方法
除了limit()方法之外,还有一个方法skip(),它也接受数字类型参数,用于跳过文档的数量。
语法
skip()方法的基本语法如下−
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
实例
以下示例将仅显示第二个文档。
>db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1) {"title":"NoSQL Overview"} >
请注意,skip()方法中的默认值为0。
sort()方法
要对MongoDB中的文档进行排序,需要使用sort()方法。该方法接受包含字段列表及其排序顺序的文档。要指定排序顺序,使用1和-1。1用于升序,-1用于降序。
语法
sort()方法的基本语法如下−
>db.COLLECTION_NAME.find().sort({KEY:1})
实例
考虑集合myycol具有以下数据。
{_id : ObjectId("507f191e810c19729de860e1"), title: "MongoDB Overview"}
{_id : ObjectId("507f191e810c19729de860e2"), title: "NoSQL Overview"}
{_id : ObjectId("507f191e810c19729de860e3"), title: "Tutorials Point Overview"}
以下示例将按标题降序显示文档。
>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1}) {"title":"Tutorials Point Overview"} {"title":"NoSQL Overview"} {"title":"MongoDB Overview"} >
请注意,如果您没有指定排序首选项,那么sort()方法将按升序显示文档。
索引支持查询的高效解析。如果没有索引,MongoDB必须扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描效率很低,需要MongoDB处理大量数据。
索引是特殊的数据结构,以易于遍历的形式存储数据集的一小部分。索引存储特定字段或字段集的值,按索引中指定的字段值排序。
createIndex()方法
要创建索引,需要使用MongoDB的createIndex()方法。
语法
createIndex()方法的基本语法如下()。
>db.COLLECTION_NAME.createIndex({KEY:1})
这里key是要在其上创建索引的字段的名称,1表示升序。要按降序创建索引,需要使用-1。
实例
>db.mycol.createIndex({"title":1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } >
在createIndex()方法中,您可以传递多个字段,以在多个字段上创建索引。
>db.mycol.createIndex({"title":1,"description":-1}) >
此方法还接受选项列表(可选)。以下是列表−
参数 | 类型 | 描述 |
---|---|---|
background | Boolean | 在后台生成索引,以便生成索引不会阻止其他数据库活动。指定true以在后台生成。默认值为false。 |
unique | Boolean | 创建唯一索引,以使集合不接受插入索引键与索引中现有值匹配的文档。指定true以创建唯一索引。默认值为false。 |
name | string | 索引的名称。如果未指定,MongoDB将通过连接索引字段的名称和排序顺序来生成索引名称。 |
sparse | Boolean | 如果为true,则索引仅引用具有指定字段的文档。这些索引使用较少的空间,但在某些情况下(特别是排序)表现不同。默认值为false。 |
expireAfterSeconds | integer | 以秒为单位指定一个TTL值,以控制MongoDB在此集合中保留文档的时间。 |
weights | document | 权重是一个范围从1到99999的数字,表示该字段相对于其他索引字段在分数方面的重要性。 |
default_language | string | 对于文本索引,确定停止词列表以及词干分析器和标记器规则的语言。默认值为英语。 |
language_override | string | 对于文本索引,请指定文档中包含的字段的名称,以及替代默认语言的语言。默认值为语言。 |
dropIndex()方法
您可以使用MongoDB的dropIndex()方法删除特定索引。
语法
DropIndex()方法的基本语法如下()。
>db.COLLECTION_NAME.dropIndex({KEY:1})
这里,“key”是要删除其现有索引的文件的名称。您也可以直接将索引的名称指定为:
dropIndex("name_of_the_index")
例子
> db.mycol.dropIndex({"title":1}) { "ok" : 0, "errmsg" : "can't find index with key: { title: 1.0 }", "code" : 27, "codeName" : "IndexNotFound" }
dropIndexes()方法
此方法删除集合上的多个(指定的)索引。
语法
DropIndexes()方法的基本语法如下()−
>db.COLLECTION_NAME.dropIndexes()
实例
假设我们在命名的mycl集合中创建了2个索引,如下所示
> db.mycol.createIndex({"title":1,"description":-1})
以下示例删除了上面创建的mycol−
>db.mycol.dropIndexes({"title":1,"description":-1}) { "nIndexesWas" : 2, "ok" : 1 } >
getIndexes()方法
此方法返回集合中所有索引的描述。
语法
以下是getIndexes()方法的基本语法−
db.COLLECTION_NAME.getIndexes()
实例
假设我们在命名的mycl集合中创建了2个索引,如下所示
> db.mycol.createIndex({"title":1,"description":-1})
以下示例检索集合mycl−中的所有索引
> db.mycol.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.mycol" }, { "v" : 2, "key" : { "title" : 1, "description" : -1 }, "name" : "title_1_description_-1", "ns" : "test.mycol" } ] >
聚合操作处理数据记录并返回计算结果。聚合操作将多个文档中的值分组在一起,并可以对分组数据执行各种操作以返回单个结果。在SQL count(*)和groupby中,相当于MongoDB聚合。
aggregate()方法
对于MongoDB中的聚合,应该使用aggregate()方法。
语法
aggregate()方法的基本语法如下−
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
实例
在集合中,您有以下数据−
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
现在,从上面的集合中,如果您想显示一个列表,说明每个用户编写了多少教程,那么您将使用以下aggregate()方法−
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "_id" : "tutorials point", "num_tutorial" : 2 } { "_id" : "Neo4j", "num_tutorial" : 1 } >
上述用例的Sql等价查询将按用户从mycol组中选择count(*)。
在上面的示例中,我们按照字段by_user对文档进行了分组,每次出现by_user时,前面的sum值都会递增。以下是可用聚合表达式的列表。
表达式 | 描述 | 例子 |
---|---|---|
$sum | 汇总集合中所有文档的定义值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算集合中所有文档中所有给定值的平均值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 从集合中的所有文档中获取相应值的最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档的相应值的最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 将值插入结果文档中的数组。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 将值插入结果文档中的数组,但不创建重复项。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据分组从源文档中获取第一个文档。通常,这与之前应用的“$sort”阶段一起使用才有意义。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据分组从源文档中获取最后一个文档。通常,这与之前应用的“$sort”阶段一起使用才有意义。 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道概念
在UNIX命令中,shell管道意味着可以对某些输入执行操作,并将输出用作下一个命令等的输入。MongoDB在聚合框架中也支持相同的概念。有一组可能的阶段,每个阶段都作为一组文档作为输入,并生成一组最终的文档(或管道末端的最终JSON文档)。然后,这又可用于下一阶段等。
以下是聚合框架的可能阶段−
$project–用于从集合中选择某些特定字段。
$match–这是一个过滤操作,因此可以减少作为下一阶段输入的文档数量。
$group–这是如上所述的实际聚合。
$sort−对文档进行排序。
$skip–使用此选项,可以在给定数量的文档列表中向前跳转。
$limit–这限制了要查看的文档数量,从当前位置开始,按给定的数量计算。
$展开–用于展开使用数组的文档。使用数组时,数据是预连接的,此操作将被撤消,从而再次生成单个文档。因此,在这一阶段,我们将增加下一阶段的文件数量。