MongoDB进阶

1、$type操作符

用途:使用MongoDB时,在需要根据字段的类型来查询数据时,可以使用$type操作符来完成。

语法:db.collection.find({字段:{$type:类型}})

其中,类型的值可以使用以下列出的

TypeNumberAliasNotes
Double1“double”
String2“string”
Object3“object”
Array4“array”
Binary data5“binData”
Undefined6“undefined”Deprecated.
ObjectId7“objectId”
Boolean8“bool”
Date9“date”
Null10“null”
Regular Expression11“regex”
DBPointer12“dbPointer”Deprecated.
JavaScript13“javascript”
Symbol14“symbol”Deprecated.
JavaScript (with scope)15“javascriptWithScope”
32-bit integer16“int”
Timestamp17“timestamp”
64-bit integer18“long”
Decimal12819“decimal”New in version 3.4.
Min key-1“minKey”
Max key127“maxKey”

示例:

db.my_collection.insert({"name":"rlxy93","age":21})
WriteResult({ "nInserted" : 1 })
> db.my_collection.insert({"name":"lxy","age":22})
WriteResult({ "nInserted" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 21 }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
> db.my_collection.find({age:{$type:"double"}})
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 21 }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }

2、条件操作符

用途:在查询过程中,需要大于某个值或小于某个值。

语法:db.collection.find({字段:{条件操作符:值}})

条件操作符可取的值有

(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte

示例:

> db.my_collection.find({age:{$gt:21}})
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }

3、聚合函数

用途:在查询过程中,需要获取某一列的总和,平均值等。

介绍:基本聚合函数有三种:count,distinct和group。

count

用途:统计符合条件的文档的数量。

语法:db.collection.count(query)或db.collection.find(query).count()

示例:

> db.my_collection.find({age:{$gt:20}})
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 21 }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
> db.my_collection.find({age:{$gt:20}}).count()
2

distinct

用途:去除查询后的重复文档。

语法:db.collection.distinct(field,query)

示例:

> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 21 }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
> db.my_collection.distinct("age",{age:{$gt:20}})
[ 21, 22 ]

4、修改器

用途:用于更新操作。

取值:$inc,$set,$unset,$push,$pop,$pull,$upsert。

$inc

用途:对数值类型进行自增自减某个值。

示例:

> db.my_collection.update({"name":"rlxy93"},{$inc:{"age":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 22 }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
> db.my_collection.update({"name":"rlxy93"},{$inc:{"age":3}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25 }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }

$set

用途:指定键并更新键值,如果键不存在则创建。

示例:

> db.my_collection.update({"name":"rlxy93"},{$set:{"address":"chongqing"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "chongqing" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
> db.my_collection.update({"name":"rlxy93"},{$set:{"address":"sichuan"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
#更改值中的键值,需要使用.连接符
> db.my_collection.insert({"name":"a","age":20,"list":{"a":"a","b":"b","c":"c"}})
WriteResult({ "nInserted" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : { "a" : "a", "b" : "b", "c" : "c" } }
> db.my_collection.update({"name":"a"},{$set:{"list.a":"A"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : { "a" : "A", "b" : "b", "c" : "c" } }

$unset

用途:删除键。

示例:

> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : { "a" : "A", "b" : "b", "c" : "c" } }
> db.my_collection.update({"name":"a"},{$unset:{"list":-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20 }

$push

用途:向数组类型的键里面添加一个数组元素。

示例:

> db.my_collection.update({"name":"a"},{$push:{"list":0}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : [ 0 ] }
> db.my_collection.update({"name":"a"},{$push:{"list":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : [ 0, 1 ] }

$pop

用途:将数组类型的键值里面从头或者尾删除元素。

示例:

> db.my_collection.update({"name":"a"},{$pop:{"list":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : [ 0, 1 ] }
> db.my_collection.update({"name":"a"},{$pop:{"list":-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : [ 1 ] }

$pull

用途:删除满足条件的数组中的元素。

示例:

> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : [ 1, 0, 2, 3, 4 ] }
> db.my_collection.update({"name":"a"},{$pull:{"list":3}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.my_collection.find()
{ "_id" : ObjectId("5dec9fe3a849a105badc5d27"), "name" : "rlxy93", "age" : 25, "address" : "sichuan" }
{ "_id" : ObjectId("5dec9feda849a105badc5d28"), "name" : "lxy", "age" : 22 }
{ "_id" : ObjectId("5decaa9968bcf6e521e4d3aa"), "name" : "l", "age" : 21 }
{ "_id" : ObjectId("5decb1ad68bcf6e521e4d3ad"), "name" : "a", "age" : 20, "list" : [ 1, 0, 2, 4 ] }

$upsert

用途:upsert是一种特殊的更新,如果没有符合条件的文档,就以upsert设置的条件来创建一个新的文档,如果有,则在已有的文档上进行更新。

示例:

> db.my_collection.update({"name":"b"},{$inc:{"age":22}},true)
WriteResult({
        "nMatched" : 0,
        "nUpserted" : 1,
        "nModified" : 0,
        "_id" : ObjectId("5decb7e26f15b1488bba141a")
})
> db.my_collection.find()
{ "_id" : ObjectId("5decb7e26f15b1488bba141a"), "name" : "b", "age" : 22 }

12-23 19:30