您现在的位置是:首页 >技术交流 >MongoDB教程-4网站首页技术交流

MongoDB教程-4

长河 2024-07-20 00:01:02
简介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})
>

此方法还接受选项列表(可选)。以下是列表−

参数类型描述
backgroundBoolean在后台生成索引,以便生成索引不会阻止其他数据库活动。指定true以在后台生成。默认值为false。
uniqueBoolean创建唯一索引,以使集合不接受插入索引键与索引中现有值匹配的文档。指定true以创建唯一索引。默认值为false。
namestring索引的名称。如果未指定,MongoDB将通过连接索引字段的名称和排序顺序来生成索引名称。
sparseBoolean如果为true,则索引仅引用具有指定字段的文档。这些索引使用较少的空间,但在某些情况下(特别是排序)表现不同。默认值为false。
expireAfterSecondsinteger以秒为单位指定一个TTL值,以控制MongoDB在此集合中保留文档的时间。
weightsdocument权重是一个范围从1到99999的数字,表示该字段相对于其他索引字段在分数方面的重要性。
default_languagestring对于文本索引,确定停止词列表以及词干分析器和标记器规则的语言。默认值为英语。
language_overridestring对于文本索引,请指定文档中包含的字段的名称,以及替代默认语言的语言。默认值为语言。

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–这限制了要查看的文档数量,从当前位置开始,按给定的数量计算。
$展开–用于展开使用数组的文档。使用数组时,数据是预连接的,此操作将被撤消,从而再次生成单个文档。因此,在这一阶段,我们将增加下一阶段的文件数量。 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。