《MongoDB权威指南》学习摘录php
该操做文档会自动生成一个"_id"键python
>db.foo.insert({“bar” : “baz”})
>db.foo.batchInsert([{ "_id" : 0 } , { "_id" : 1 } , { "_id" : 2 }])
当前mongodb能接受的最大消息长度是48MB,而且若是在执行批量插入过程当中有一个文档插入失败,则在该文档以前的全部文档都会成功插入到集合中,而这个文档以后的全部文档所有插入失败。正则表达式
//删除foo集合的全部文档 >db.foo.remove() //删除指定查询文档做为可选参数 >db.mailing.list.remove( { “opt-out” : true } )
>db.foo.drop()
{ "_id": ObjectId("..."), "name": "joe", "friends": 32, "enemies": 2 }
如今须要更新"friends"和"enemies"两个字段到"relationships"子文档中mongodb
>var joe = db.users.findOne({"name":joe}); >joe.relationships = {"friends":joe.friends,"enemies":joe.enemies}; { "friends":32, "enemies":2 } >joe.username = joe.name; "joe" >delete joe.friends; true >delete joe.enemies; true >delete joe.name; true >db.users.update({"name":"joe"},joe);
更新后的文档json
{ "_id":ObjectId("..."), "username":"joe", "relationships":{ "friends":32, "enemies":2 } }
常见的错误是查询条件匹配到多个文档,而后更新的时候回因为第二个参数的存在就产生重复的"_id"值,对于这种状况要使用"_id"值来进行查询数组
"$inc"修改器使用bash
当有人访问页面的时候,就经过url找到该页面,而后使用"$inc"修改器增长"pagerviews"的值函数
{ "_id":ObjectId("..."), "url":"www.lgybetter.com", "pagerviews":52 }
>db.analytics.update({"url":"www.lgybetter.com"},{"$inc" : {"pagerviews" : 1}})
注意,使用修改器时,"_id"并不会改变,而文档替换过则会post
"$set"修改器使用学习
>db.user.update({"_id":ObjectId(...)},{"$set" : {"favorite book" : "War and Peace"}})
因而更新后的文档就有了"favorite book"键,若是要继续修改则:
>db.user.update({"_id":ObjectId(...)},{"$set" : {"favorite book" : "Green Eggs and Ham"}})
也能够变为数组的类型
使用"$unset"能够将这个键彻底删除:
>db.user.update({"name":joe},{"$unset" : {"favorite book" : 1}})
"$push"修改器使用
若是数组存在,"$push"会向已有的数组的末尾加入一个元素,若是没有改数组就建立一个新的数组
{ "_id":ObjectId("..."), "title":"A blog post", "content":"..." }
>db.blogs.posts.update({"title" : "A blog post"},{"$push" : { "comments" : {"name" : "joe","email" : "joe@example.com","content":"nice post."} }}) >db.blog.posts.findOne() { "_id":ObjectId("..."), "title":"A blog post", "content":"...", "comments": [ { "name":"joe", "email":"joe@example.com", "content":"nice post" } ] }
注意,"$push"会建立一个数组的类型,可用于动态添加数据
用"$push"一次添加多个数据,配合使用"$each"
>db.stock.ticker.update({"_id":"GOOG"},{ "$push" : {"hourly" : { "$each" : [ 562.776,562.790,559.123 ]}} })
使用"$slice"来固定数组的最大长度
>db.movies.find({"genre" : "horror"},{ "$push" : { "top10" : { "$each" : ["Nightmare on Elm Street" , "Saw"], "$slice" : -10, "$sort" : {"rating" : -1} } } })
注意,"$slice"的值应该是负整数,"$sort"能够用来对数组中的全部对象进行排序,不能只将"$slice"或者"$sort"与"$push"配合使用,且必须使用"$each"。
使用"$ne",使得数组变为数据集合
>db.paper.update({"authors cited" : {"$ne" : "Richie"}, {"$push" : {"authors cited" : "Richie"}} })
"$addToSet"和"$each"组合使用,效果是与"$ne"同样,可是能够用来同时插入多条数据
>db.users.update({"_id" : ObjectId("...")}, {"$addToSet" : {"emails" : {"$each" : ["joe@php.net","joe@example.com","joe@python.org"] }} })
使用"$pop"删除数组元素{"$pop" : {"key" : 1}}从数组末尾删除,{"$pop" : {"key" : -1}}从数组头部删除
使用"$pull"删除元素
>db.lists.update({},{"$pull" : {"todo" : "laundry"}})
upsert是一种特殊的更新,要是没有找到符合更新条件的文档,就会以这个条件和更新
文档为基础建立一个新的文档。
>db.analytics.update({"url" : "/blog"} , {"$inc" : {"pageviews" : 1}} ,true)
有时候,须要在建立文档的同时建立字段并为它赋值,可是在以后的全部更新操做中,该字段的值就再也不改变。这时候就使用"$setOnInsert"
>db.users.update({} , {"$setOnInsert" : {"createdAt" new Date()}},true)
具体的操做值经过:
>db.runCommand({getLastError:1})
返回结果
{ "err":null, "updatedExisting":true, "n":5, "ok":true }
查询该集合下的全部文档
>db.c.find()
查询特定值的文档,能够同时添加多个条件
>db.users.find({"age" : 20}) >db.users.find({"age" : 20 , "name" : "lgy"}) //指定须要返回的键 >db.users.find({} , {"username" : 1,"email" : 1}) //返回结果 { "_id":ObjectId("..."), "username":"lgy", "email":"lgy@example.com" }
经过查询,默认状况下回返回"_id"这个键,若是但愿不出现其余的键值,就使用以下:
>db.users.find({},{"username" : 1,"_id" : 0}) //返回结果 { "username":"lgy" }
查询条件:
"$lt","$lte","$gt","$gte"就是所有的比较操做符,分别对应<,<=,>,>=
//查询18 ~ 30岁的用户: >db.users.find({"age" : {"$gte" : 18 , "$lte" : 30}})
"$ne"表示不等于某个特定的值
//查询用户名不为"lgy"的全部用户 >db.users.find({"username" : {"$ne" : "lgy"}})
OR查询:
"$in" 和 "$or"两种方式进行OR查询
>db.raffle.find({"ticket_no" : {"$in" : [725,542,390]}})
"$nin"是与"$in"相反的
>db.raffle.find({"$or" : [{"ticket_no" : 725},{"winner" : true}]})
二者结合使用:
>db.raffle.find({"$or" : [{"ticket_no" : {"$in" : [725,542,300]}},{"winner" : true}]})
$not
"$not"是元条件句,便可以在任何其余条件之上。
"$mod"经过传入两个参数,第一个用来做为除数,第二个是用来断定余数是否为此数字
>db.user.find({"id_num" : {"$not" : {"$mod" : [5,1]}}})
null
null不只会匹配某个键的值为null的文档,并且还匹配不包含这个键的文档
>db.c.find({"z" : null})
若是仅仅想匹配键值为null的文档,则能够加"$exists"条件:
>db.c.find({"z" : {"$in" : [null], "$exists" : true}})
正则表达式
>db.users.find({"name" : /joey?/i})
查询数组
$all,能够用来进行多个元素匹配数组
//这样查找就能够匹配到同时存在的两个元素的文档 >db.food.find({"fruit" : {"$all" : ["people","banana"]}})
$size用来查询特定长度的数组
>db.food.find({"furit" : {"$size" : 3}})
$slice用来返回某个匹配数组元素的一个子集
//返回前十条评论,若是把10换成-10就是返回后十条评论 >db.blog.posts.findOne(criteria,{"comments" : {"$slice" : 10}}) //这个操做会跳过前面23个元素,返回第24~33个元素 >db.blog.posts.findOne(criteria,{"comments" : {"$slice" : [23,10]}})
返回一个匹配的数组元素
>db.blog.find({"comments.name" : "bob"}, {"comments.$" : 1}) //返回结果 { "id" : ObjectId("..."), "comments" : [ { "name" : "bob", "email" : "bob@example.com", "content" : "good post" } ] } //这样就只会返回第一条评论
查询内嵌文档
如今有这样的数据
{ "name": { "first":"joe", "last":"Schmoe" }, "age":45 }
对内嵌文档的查询
//用点表示法表达"进入内嵌文档内部"的意思 >db.people.find({"name.first" : "joe" ,"name.last" : "Schmoe"})
要正确指定一组条件,而没必要指定每一个键,就须要使用"$elematch"
>db.blog.find({"comments" : {$elematch" : {"author" : "joe", "score" : {"$gte" : 5}}}})
游标查询的具体操做:
>for(i = 0; i <100; i ++) { db.collection.insert({x : i}); } >var cursor = db.collection.find(); >while(cursor.hasNext()) { obj = cursor.next(); //输出查看 } ###limit,skip,和sort >db.c.find().limit(3) >db.c.find().skip(3)