看MongoDB: The Definitive Guide做的笔记,Not a tutorial
Mongodb中有document,collection,database
关系为database里有多个collection,每个collection里有多个document
document就是以key-value的形式存放的,value也可以是document
在shell里,db代表当前所使用的数据库,
show dbs #显示所有数据库 db.version() #显示Mongodb的版本号
以下"collection"代表任意collection
db.collection.update #mongodb的update是atomic,假如有两个人同时update同一个数据,两个都会生效,数据的状态是最后update的状态(last update win)
db.collection.remove #不加参数则全部删除,但保留index
x = db.collection.findOne() x.num = 42 db.collection.save(x) #shell中一种比用update来更新的更好办法
db.drop_collection("name_of_collection") #彻底删除
db.collection.insert() #插入document
update里用的modifier
$set #用来设置一个document,如不存在则创建该document
{"$set" : {"author.name" : "joe schmoe"}}
$unset #用来删除一个document
$inc #用来增加一个document的value部分,value必需是数字。如不存在则创建该document
{"$inc" : {"score" : 10000}}
$push #用来向一个document的value部分,以数组的方式
{$push : {"comments" :{"name" : "joe", "email" : "[email protected]", "content" : "nice post."}}
$ne #与$push配合使用,不存在存会添加,存在就不会添加
{"authors cited" : {"$ne" : "Richie"}}, {$push : {"authors cited" : "Richie"}}
$addToSet #同上,但是是单独使用的.有的时候你不确定某个document到底存不存在,用这个就不会造成数据的重复
{"$addToSet" : {"emails" : "[email protected]"}}
$each #与$addToSet配合使用,添加数组
{"$addToSet" :{"emails" : {"$each" : ["[email protected]","[email protected]","[email protected]"]}}
$pop #像栈一样删除,随便从哪头开始
{$pop : {key : 1}} {$pop : {key : -1}}
$pull #根据所给的KEY删除指定的document,假如有多个KEY匹配,则删除多个document
{"$pull" : {"todo" : "laundry"}}
假如有下面这样的一个docment
{ "_id" : ObjectId("4b329a216cc613d5ee930192"), "content" : "...", "comments" : [ { "comment" : "good post", "author" : "John", "votes" : 0 }, { "comment" : "i thought it was too short", "author" : "Claire", "votes" : 3 }, { "comment" : "free watches", "author" : "Alice", "votes" : -1 }] }
我们现在想要更新第一个名为good post的comments的votes,可以这样做
db.blog.update({"post" : post_id}, {"$inc" : {"comments.0.votes" : 1}}) #看见没,可以像操作数组一样,多方便啊
现在我们来把这个comment的author由John改成Jim,但如果这个时候我不知道John是在数组里的第几个,即我不知道index,这个时候可以用$,即原来用index的地主改成$,就像下面这样
db.blog.update({"comments.author" : "John"},{"$set" : {"comments.$.author" : "Jim"}})
update还有另一种形式,就是其第三个参数设置为true,使之成为一个upsert
db.analytics.update({"url" : "/blog"}, {"$inc" : {"visits" : 1}}, true)
上面的update包含了两个意思,以{url : "/blog"}进行查询,成功找到就更新,没有找到就创建
这样我们就不用自己写代码来判断存在或是不存在的情况了
update默认情况下只会更新第一个匹配的到的数据,如果要更新所有都匹配的数据,只要把它的第四个参数也设置为true就行