mongodb中的查詢find操做

要練習查詢首先要有數據,先用for循環插入了20條數據(就是javascript語法)javascript

> for( var i=1;i<=20;i++){ db.student.insert({"name":"name"+i,"sort":"sort"+i,"tel":"1234"+i})}

mongodb是用find來進行查詢的,返回一個集合中文檔的子集,子集合範圍從0個文檔到整個文檔,也是經過參數決定要查詢的細節。空的查詢文檔會匹配集合的全部內容,如要不指定查詢內容,默認就是{}。java

查詢全部內容

語法:db.<集合名>.find()(相似於sql中的select * from 表名)【等同於db.<集合名>.find({})】
python

查詢一條記錄

db.<集合名>.findOne();(findOne()首字母one要大寫,~.~)sql

> db.student.findOne()
{
    "_id" : ObjectId("56e4d9e9bf48eabb5d350a99"),
    "name" : "name1",
    "sort" : "sort1",
    "tel" : "12341"
}
返回指定的鍵

語法:db.<集合>.find({},{"鍵名":1,"鍵名":0})後面的這個{}裏面指定要查詢的內容,須要的就給參數 1,不須要的就給參數0(相似於sql中select 列名,列名 from 表名)mongodb

> db.student.find({},{name:1,_id:0})
{ "name" : "name1" }
{ "name" : "name2" }
{ "name" : "name3" }
{ "name" : "name4" }
{ "name" : "name5" }
{ "name" : "name6" }
{ "name" : "name7" }
{ "name" : "name8" }
{ "name" : "name9" }
{ "name" : "name10" }
{ "name" : "name11" }
{ "name" : "name12" }
{ "name" : "name13" }
{ "name" : "name14" }
{ "name" : "name15" }
{ "name" : "name16" }
{ "name" : "name17" }
{ "name" : "name18" }
{ "name" : "name19" }
{ "name" : "name20" }

只要name這個鍵,默認的會返回_id,咱們設置_id:0便可。
shell

查詢條件

在第一個{}來指定條件,進行查詢,相似sql中的where查詢
數組

> db.student.find({"tel":{"$gte":"123410","$lte":"123413"}})
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa2"), "name" : "name10", "sort" : "sort10", "tel" : "123410" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa3"), "name" : "name11", "sort" : "sort11", "tel" : "123411" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa4"), "name" : "name12", "sort" : "sort12", "tel" : "123412" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa5"), "name" : "name13", "sort" : "sort13", "tel" : "123413" }

查詢tel在123410和123413之間的文檔。函數

下面這個是指定記錄查詢,有點相似於sql中的(select * from student where tel="12342";)
spa

> db.student.find({"tel":"12342"})
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9a"), "name" : "name2", "sort" : "sort2", "tel" : "12342" }

> db.student.find({"tel":"12342","name":"123"})

> db.student.find({"tel":"12342","name":"name2"})
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9a"), "name" : "name2", "sort" : "sort2", "tel" : "12342" }

在find前面一個{}裏面用,鏈接的映射條件,其實就是and條件的查詢,code

在mongodb中也有對應的 or 查詢使用的,符號是 $or

> db.student.find({$or:[{"name":"name2"},{"name":"name3"}]})
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9a"), "name" : "name2", "sort" : "sort2", "tel" : "12342" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9b"), "name" : "name3", "sort" : "sort3", "tel" : "12343" }

$in基本上也是or的關係,和MySQL中的in(..,..,...)相似    另外$nin和$in關係是相反的,相似於 not in(,)

> db.student.find({"tel":{$in:["12341","12342","123420"]}})
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a99"), "name" : "name1", "sort" : "sort1", "tel" : "12341" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9a"), "name" : "name2", "sort" : "sort2", "tel" : "12342" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aac"), "name" : "name20", "sort" : "sort20", "tel" : "123420" }

$all用來經過多個元素匹配數組數組

> db.food.insert({"animal":["dog","cat","python"]})
> db.food.insert({"animal":["dog","cat","pig"]})
> db.food.insert({"animal":["pig","cat","python"]})

> db.food.find({"animal":{$all:["cat","python"]}},{_id:0})
{ "animal" : [ "dog", "cat", "python" ] }
{ "animal" : [ "pig", "cat", "python" ] }

排序.sort

語法:db.<集合名>.find().sort({"鍵名":1})(參數1爲升序,-1爲降序)

限制數目 .limit

語法:db.<集合名>.find().limit(number)(number爲限制返回的數目)

> db.student.find().sort({"tel":1}).limit(5)
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a99"), "name" : "name1", "sort" : "sort1", "tel" : "12341" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa2"), "name" : "name10", "sort" : "sort10", "tel" : "123410" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa3"), "name" : "name11", "sort" : "sort11", "tel" : "123411" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa4"), "name" : "name12", "sort" : "sort12", "tel" : "123412" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa5"), "name" : "name13", "sort" : "sort13", "tel" : "123413" }
> db.student.find().sort({"tel":-1}).limit(5)
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa1"), "name" : "name9", "sort" : "sort9", "tel" : "12349" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa0"), "name" : "name8", "sort" : "sort8", "tel" : "12348" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9f"), "name" : "name7", "sort" : "sort7", "tel" : "12347" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9e"), "name" : "name6", "sort" : "sort6", "tel" : "12346" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9d"), "name" : "name5", "sort" : "sort5", "tel" : "12345" }

上面是對tel進行降序和升序的查詢。並指定返回5條記錄

跳過記錄:.skip(number)

> db.student.find().skip(15)
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa8"), "name" : "name16", "sort" : "sort16", "tel" : "123416" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa9"), "name" : "name17", "sort" : "sort17", "tel" : "123417" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aaa"), "name" : "name18", "sort" : "sort18", "tel" : "123418" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aab"), "name" : "name19", "sort" : "sort19", "tel" : "123419" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aac"), "name" : "name20", "sort" : "sort20", "tel" : "123420" }

一共20行記錄,省略了前面15行,只返回後面5行

能夠使用.skip().limit()實現翻頁的功能

> db.student.find().skip(5).limit(5)
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9e"), "name" : "name6", "sort" : "sort6", "tel" : "12346" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9f"), "name" : "name7", "sort" : "sort7", "tel" : "12347" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa0"), "name" : "name8", "sort" : "sort8", "tel" : "12348" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa1"), "name" : "name9", "sort" : "sort9", "tel" : "12349" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa2"), "name" : "name10", "sort" : "sort10", "tel" : "123410" }
> db.student.find().skip(10).limit(5)
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa3"), "name" : "name11", "sort" : "sort11", "tel" : "123411" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa4"), "name" : "name12", "sort" : "sort12", "tel" : "123412" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa5"), "name" : "name13", "sort" : "sort13", "tel" : "123413" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa6"), "name" : "name14", "sort" : "sort14", "tel" : "123414" }
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa7"), "name" : "name15", "sort" : "sort15", "tel" : "123415" }

聚合操做

求數目

語法:db.<集合>.count() ;相似於sql中select count(*) from 表名

> db.student.count()
20
> db.student.find().limit(1)
{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a99"), "name" : "name1", "sort" : "sort1", "tel" : "12341" }

若是是求某一列的

> db.student.count({},{"name":1})
20

通常的數學運算

先模擬數據

> for(var i=1;i<20;i++){db.test1.insert({"num":i})}
WriteResult({ "nInserted" : 1 })

下面是關於一列的求和,最大值,最小值,和平均值
語法:db.<集合名>.aggregate({$group:{_id:"  ",返回的名字:{函數:"$列名"}}})

> db.test1.aggregate({$group:{_id:"  ",sumsal:{$sum:"$num"}}})
{ "_id" : "  ", "sumsal" : 190 }
> db.test1.aggregate({$group:{_id:"  ",sumsal:{$max:"$num"}}})
{ "_id" : "  ", "sumsal" : 19 }
> db.test1.aggregate({$group:{_id:"  ",sumsal:{$min:"$num"}}})
{ "_id" : "  ", "sumsal" : 1 }
> db.test1.aggregate({$group:{_id:"  ",sumsal:{$avg:"$num"}}})
{ "_id" : "  ", "sumsal" : 10 }


在mangodb中進行sql中group by 的操做,只須要在原來基礎空格上加上列名

從新模擬數據

> for(var i=1;i<5;i++){db.test2.insert({"num":i,"type":1})}
WriteResult({ "nInserted" : 1 })
> for(var i=5;i<10;i++){db.test2.insert({"num":i,"type":2})}
WriteResult({ "nInserted" : 1 })
> for(var i=10;i<15;i++){db.test2.insert({"num":i,"type":3})}
WriteResult({ "nInserted" : 1 })

> db.test2.aggregate({$group:{_id:"$type",sumsal:{$avg:"$num"}}})
{ "_id" : 3, "sumsal" : 12 }
{ "_id" : 2, "sumsal" : 7 }
{ "_id" : 1, "sumsal" : 2.5 }

若是須要組名

> db.test2.aggregate({$group:{_id:{type:"$type"},sumsal:{$sum:"$num"}}})
{ "_id" : { "type" : 3 }, "sumsal" : 60 }
{ "_id" : { "type" : 2 }, "sumsal" : 35 }
{ "_id" : { "type" : 1 }, "sumsal" : 10 }

多列分組,在原來的基礎上在進行分組

固定的字符串,咱們只須要定義列名就行咯

> db.test2.aggregate({$group:{_id:{type:"$type","名字":"列名"},sumsal:{$sum:"$num"}}})
相關文章
相關標籤/搜索