文章目錄
上一篇簡答描述了一下的MongoDB的介紹,這一篇要進入主題了,來記錄MangoDB的用法
1.Save增加資料
> db.foo.save({"name":"xiaoming"})> db.foo.find(){ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }
save用來增加一條資料幾點需要注意:
- 不需要預先建立一個集合(也就是資料表),在第一次插入資料的時候會自動建立
- 可以儲存任何的資料結構,不需要類似於alter table語句來修改你的資料結構
- 每次插入新資料時會在集合中建立一個ID,名字叫_id
可以多增加點資料
> db.foo.save({'name':'xiaoming',age:10,score:90})> db.foo.save({'name':'xiaozhang',age:10,score:85})> db.foo.save({'name':'xiaoli',age:11,score:99})> db.foo.save({'name':'xiaomeng',age:11,score:100})> db.foo.find(){ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }{ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming", "age" : 10, "score" : 90 }{ "_id" : ObjectId("51e510243c10628f02cfb77b"), "name" : "xiaozhang", "age" : 10, "score" : 85 }{ "_id" : ObjectId("51e510353c10628f02cfb77c"), "name" : "xiaoli", "age" : 11, "score" : 99 }{ "_id" : ObjectId("51e510403c10628f02cfb77d"), "name" : "xiaomeng", "age" : 11, "score" : 100 }>
2.查詢記錄2.1 普通無條件查詢在上文中已經看到這樣一個操作,它是查詢foo這個集合中的所有資料
> db.foo.find()
返回遊標對象:
> var cursor=db.foo.find()> while(cursor.hasNext())printjson(cursor.next()){ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }{ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming", "age" : 10, "score" : 90}{ "_id" : ObjectId("51e510243c10628f02cfb77b"), "name" : "xiaozhang", "age" : 10, "score" : 85}{ "_id" : ObjectId("51e510353c10628f02cfb77c"), "name" : "xiaoli", "age" : 11, "score" : 99}{ "_id" : ObjectId("51e510403c10628f02cfb77d"), "name" : "xiaomeng", "age" : 11, "score" : 100}>
上面的例子顯示了遊標風格的迭代輸出,hasNext()函數告訴我們是否還有資料,如果有則可以調用next()函數擷取資料。
mongodb採用的是JavaScript shell,可以用到JS的特性,forEach就可以輸出遊標了。如下:
> var cursor=db.foo.find()> while(cursor.hasNext())printjson(cursor.next()){ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }{ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming", "age" : 10, "score" : 90}{ "_id" : ObjectId("51e510243c10628f02cfb77b"), "name" : "xiaozhang", "age" : 10, "score" : 85}{ "_id" : ObjectId("51e510353c10628f02cfb77c"), "name" : "xiaoli", "age" : 11, "score" : 99}{ "_id" : ObjectId("51e510403c10628f02cfb77d"), "name" : "xiaomeng", "age" : 11, "score" : 100}>
能達到和while同樣的效果
在MongoDB shell裡,我們可以把遊標當作資料來用:
> var cursor=db.foo.find();> printjson(cursor[1]){ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming", "age" : 10, "score" : 90}>
不過要注意的是,使用上面這種方式,要注意佔用記憶體的問題,特別是很大的遊標對象,有可能會記憶體溢出,所以應該用迭代的方式來輸出。下面是把遊標轉換成真實的數群組類型:
> var arr=db.foo.find().toArray()> arr[2]{ "_id" : ObjectId("51e510243c10628f02cfb77b"), "name" : "xiaozhang", "age" : 10, "score" : 85}
請注意,這此特性只是在MongoDB Sehll裡使用,而不是所有的其他應用程式驅動都支援。如果其他使用者在集合裡第一次或者最後一次調用netx(),你可能得到不遊標裡的資料。所以要明確的鎖定你要查詢的遊標。2.2 條件查詢2.2.1 單條件查詢
> db.foo.find({name:'xiaoming'}){ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }{ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming", "age" : 10, "score" : 90 }>
相當於SQL
SELECT * FROM foo WHERE name='xiaoming'
查詢指定條件下返回資料結果(類似於返回表裡某個欄位)
> db.foo.find({name:'xiaoming'},{name:true}){ "_id" : ObjectId("51e50e633c10628f02cfb779"), "name" : "xiaoming" }{ "_id" : ObjectId("51e510133c10628f02cfb77a"), "name" : "xiaoming" }
對應SQL語句
SELECT name FROM foo WHERE name='xiaoming'
2.2.2 多條件查詢未完,待續......