MongoDB入门学习(三):MongoDB的增删查改(四)

2014-11-24 10:28:26 · 作者: · 浏览: 3
e" : "mary" } > db.people.update({"name" : "mary"}, {"$pullAll" : {"friends" : ["join", "jodan"]}}) > db.people.find() { "_id" : ObjectId("53a3c18533c516902a43a794"), "friends" : [ "mical" ], "name" : "mary" }

7).$pop

$pop也是用来删除内置数组中的一个元素,这个元素要么是数组的第一个元素要么是数组的最后一个元素,如:

> db.people.find()
{ "_id" : ObjectId("53a3c18533c516902a43a794"), "friends" : [  "mical",  "amy",  "join" ], "name" : "mary" }
> db.people.update({"name" : "mary"}, {"$pop" : {"friends" : 1}})
> db.people.find()
{ "_id" : ObjectId("53a3c18533c516902a43a794"), "friends" : [  "mical",  "amy" ], "name" : "mary" }
> db.people.update({"name" : "mary"}, {"$pop" : {"friends" : -1}})
> db.people.find()
{ "_id" : ObjectId("53a3c18533c516902a43a794"), "friends" : [  "amy" ], "name" : "mary" }

8).$

$用来定位内置数组的元素,MongoDB的内置数组下标也是从0开始递增的,所以我们可以通过对数组进行定位修改,如:

> db.people.find()
{ "_id" : ObjectId("53a3c18533c516902a43a794"), "friends" : [  "amy",  "join",  "jodan" ], "name" : "mary" }
> db.people.update({"name" : "mary"}, {"$set" : {"friends.0" : "mical"}})
> db.people.find()
{ "_id" : ObjectId("53a3c18533c516902a43a794"), "friends" : [  "mical",  "join",  "jodan" ], "name" : "mary" }
> db.people.update({"name" : "mary", "friends" : "join"}, {"$set" : {"friends.$" : "amy"}})
> db.people.find()
{ "_id" : ObjectId("53a3c18533c516902a43a794"), "friends" : [  "mical",  "amy",  "jodan" ], "name" : "mary" }

上面第一种更新,我们就是单纯的想把mary的第一个朋友变成mical。第二种更新,我们不知道mary的朋友join是在数组的哪个位置,但是确实有这么个朋友,就查询到了通过$进行定位,然后再将其变成amy。

9).$rename

$rename用来对字段重命名,如:

> db.people.find()
{ "_id" : ObjectId("53a3c80a33c516902a43a795"), "name" : "mary", "friends" : [  "mical",  "amy",  "jodan" ] }
> db.people.update({"name" : "mary"}, {"$rename" : {"friends" : "classmates"}})
> db.people.find()
{ "_id" : ObjectId("53a3c80a33c516902a43a795"), "classmates" : [  "mical",  "amy",  "jodan" ], "name" : "mary" }

文档的插入,删除和更新都是瞬间完成的,因为客户端并不需要等待数据库的响应,这个也不是异步操作,因为客户端将文档给数据库了其他的操作都由数据库本身来操作,和客户端就完全没关系了。文档的查询就不一样了,客户端必须要等到数据库返回来的查询结果。

4.查询文档

查询文档的基本方法是find:

db.collectionName.find(condition, returnKey)
db.collectionName.find()
db.collectionName.find({})
db.collectionName.find({}, {"name" : 1})
db.collectionName.find({}, {"name" : 0})

find有两个参数,condition为查询文档,returnKey为指定返回的字段。不指定查询条件或者查询条件是一个空文档,那就是查询集合中的所有文档,返回值指定键,如果为1就是返回该键的值,如果为0就返回除了该键以外的所有键的值。

当然我们除了精确查询,比如查询name为mary,age为20的文档并返回其friends字段的结果,还会有更复杂的模糊查询条件,比如范围查询,age在20到30之间的文档等。这时候在查询文档中就要添加这些查询条件。

1).$lt,$lte,$gt,$gte,$ne

$lt,$lte,$gt,$gte分别对应<,<=,>,>=,可以组合起使用来查询一个范围,$ne表示不等于,如:

> db.people.find()
{ "_id" : ObjectId("53a3e01d33c516902a43a797"), "name" : "mary", "age" : 20 }
{ "_id" : ObjectId("53a3e02533c516902a43a798"), "name" : "amy", "age" : 23 }
{ "_id" : ObjectId("53a3e02d33c516902a43a799"), "name" : "join", "age" : 18 }
{ "_id" : ObjectId("53a3e03c33c516902a43a79a"), "name" : "jodan", "age" : 25 }
{ "_id" : ObjectId("53a3e04933c516902a43a79b"), "name" : "mical", "age" : 19 }
> db.people.find({"age" : {"$gte" : 19, "$lte" : 23}, "name" : {"$ne" : "mary"}}, {"_id" : 0})
{ "name" : "amy", "age" : 23 }
{ "name" : "mical", "age" : 19 }

2).$or,$in,$nin

$or,$in表示几个条件中满足一个就可以返回,但是$in只能用于在同一个字段中给几个条件,而or可以用于不同字段,还能和$in搭配使用,$nin和$in相反,表示只要不符合几个给定的条件就可以返回,如:

> db.people.find()
{ "_id" : ObjectId("53a3e01d33c516902a43a797"), "name" : "mary", "age" : 20