日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MongoDB干货篇之查询数据

發布時間:2025/5/22 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MongoDB干货篇之查询数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在開始之前我們應該先準備數據方便演示,這里我插入的了幾條數據,數據如下:

  • db.user.insertMany(?
  • [{?
  • name:'jack',?
  • age:22,?
  • sex:'Man',?
  • tags:['python','c++','c'],?
  • grades:[22,33,44,55],?
  • school:{?
  • name:'shida',?
  • city:'xuzhou'?
  • }?
  • },{?
  • name:'jhon',?
  • age:33,?
  • sex:null,?
  • tags:['python','java'],?
  • grades:[66,22,44,88],?
  • school:{?
  • name:'kuangda',?
  • city:'xuzhou'?
  • }?
  • },?
  • {?
  • name:'xiaoming',?
  • age:33,?
  • tags:['python','java'],?
  • grades:[66,22,44,88],?
  • school:{?
  • name:'kuangda',?
  • city:'xuzhou'?
  • }?
  • }?
  • ]?
  • )??
  • find( , )

    其中 query 表示查找的條件,相當于 mysql 中 where 子句, projection 列出你想要查找的數據,格式為 db.collection.find(find(<query filter>, <projection>))

    實例:

    下面不帶參數的查找,將會查找出所有的結果

  • ?db.find().pretty();?
  • ?????
  • ????//輸出結果?
  • ?????
  • ?????
  • {??????????????????????????????????????????????????????
  • ????????"_id"?:?ObjectId("59056f81299fe049404b2899"),??
  • ????????"name"?:?"jack",???????????????????????????????
  • ????????"age"?:?22,????????????????????????????????????
  • ????????"tags"?:?[?????????????????????????????????????
  • ????????????????"python",??????????????????????????????
  • ????????????????"c++",?????????????????????????????????
  • ????????????????"c"????????????????????????????????????
  • ????????],?????????????????????????????????????????????
  • ????????"grades"?:?[???????????????????????????????????
  • ????????????????22,????????????????????????????????????
  • ????????????????33,????????????????????????????????????
  • ????????????????44,????????????????????????????????????
  • ????????????????55?????????????????????????????????????
  • ????????],?????????????????????????????????????????????
  • ????????"school"?:?{???????????????????????????????????
  • ????????????????"name"?:?"shida",??????????????????????
  • ????????????????"city"?:?"xuzhou"??????????????????????
  • ????????}??????????????????????????????????????????????
  • }??
  • 下面找出滿足 name 為 jack 的數據,并且只輸出 name , age ,這里的 _id 是默認輸出的,如果不想輸出將將它設置為 0 ,想要輸出那個字段將它設置為1

  • db.user.find({name:'jack'},{name:1,age:1})?
  • ?
  • //輸出結果?
  • {?"_id"?:?ObjectId("59056f81299fe049404b2899"),?"name"?:?"jack",?"age"?:?22?}?
  • ?
  • ?
  • db.user.find({name:'jack'},{name:1,age:1,_id:0})?
  • ?
  • //輸出結果?
  • {"name"?:?"jack",?"age"?:?22?}??
  • **注意這里的一個 projection 不能 同時 指定包括和排除字段,除了排除 _id 字段。 在 顯式包括 字段的映射中, _id 字段是唯一一個您可以 顯式排除 的。

    查詢內嵌文檔

    上述例子中插入的 school 數據就表示內嵌文檔

    完全匹配查詢

    完全匹配查詢表示 school 中的查詢數組必須和插入的數組完全一樣,順序都必須一樣才能查找出來

  • db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}});?
  • ?
  • //輸出結果?
  • ?
  • {?"_id"?:?ObjectId("59056f81299fe049404b2899"),?"name"?:?"jack",?"age"?:?22,?"tags"?:?[?"python",?"c++",?"c"?],??
  • "grades"?:?[?22,?33,?44,?55?],?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}?
  • ?
  • ?
  • //下面是指定輸出的字段,這里的school.name表示只輸出school文檔中name字段,必須加引號?
  • db.user.find({name:'jack',school:{name:'shida',city:'xuzhou'}},{name:1,age:1,'school.name':1});?
  • //輸出結果?
  • {?"_id"?:?ObjectId("59056f81299fe049404b2899"),?"name"?:?"jack",?"age"?:?22,?"school"?:?{?"name"?:?"shida"?}?}??
  • 鍵值對查詢

    可以通過鍵值對查詢,不用考慮順序,比如 'school.name':'shida' ,表示查詢學校名字為shida 的數據,這里的引號是必須要的

  • db.user.find({'school.name':'shida'},{name:1,school:1});?
  • ?
  • //輸出結果?
  • ?
  • {?"_id"?:?ObjectId("59056f81299fe049404b2899"),?"name"?:?"jack",?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}??
  • 查詢操作符

    下面我們將配合查詢操作符來執行復雜的查詢操作,比如元素查詢、 邏輯查詢 、比較查詢操作。我們使用下面的比較操作符 "$gt" 、 "$gte" 、 "$lt" 、 "$lte" (分別對應 ">" 、 ">=" 、 "<" 、 "<=" )

    實例

    下面查詢年齡在 20-30 之間的信息

  • db.user.find({?
  • age:{$gt:20,$lt:30}???
  • })?
  • ?
  • //輸出?
  • {?"_id"?:?ObjectId("59056f81299fe049404b2899"),?"name"?:?"jack",?"age"?:?22,?"tags"?:?[?"python",?"c++",?"c"?],??
  • "grades"?:?[?22,?33,?44,?55?],?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}??
  • $ne

    $ne 表示不相等,例如查詢年齡不等于 22 歲的信息

  • db.user.find({age:{$ne:22}})?
  • ?
  • //輸出?
  • {?"_id"?:?ObjectId("59057c16f551d8c9003d31e0"),?"name"?:?"jhon",?"age"?:?33,?"tags"?:?[?"python",?"java"?],??
  • "grades"?:?[?66,?22,?44,?88?],?"school"?:?{?"name"?:?"kuangda",?"city"?:?"xuzhou"?}?}??
  • slice

    $slice 操作符控制查詢返回的數組中元素的個數。此操作符根據參數 { field: value } 指定鍵名和鍵值選擇出文檔集合,并且該文檔集合中指定 array 鍵將返回從指定數量的元素。如果 count 的值大于數組中元素的數量,該查詢返回數組中的所有元素的。

    語法: db.collection.find( { field: value }, { array: {$slice: count }}) ;

    下面將查詢 grades 中的前兩個數

  • db.user.find({name:'jack'},{grades:{$slice:2},name:1,age:1,'school.name':1});?
  • ?
  • //輸出,可以看出這里的grades只輸出了前面兩個?
  • ?
  • {?"_id"?:?ObjectId("59057c16f551d8c9003d31df"),?"name"?:?"jack",?"age"?:?22,?"grades"?:?[?22,?33?],?"school"?:?{?"name"?:?"shida"?}?}??
  • 下面將輸出后3個數據

  • db.user.find({name:'jhon'},{grades:{$slice:-3},name:1});?
  • ?
  • //輸出?
  • {?"_id"?:?ObjectId("59057c16f551d8c9003d31e0"),?"name"?:?"jhon",?"grades"?:?[?22,?44,?88?]?}??
  • 下面介紹指定一個數組作為參數。數組參數使用 [ skip , limit ] 格式,其中第一個值表示在數組中跳過的項目數,第二個值表示返回的項目數。

  • db.user.find({name:'jack'},{grades:{$slice:[2,2]},name:1});??//這里將會跳過前面的兩個,直接得到后面的兩個數據?
  • ?
  • ?
  • //輸出?
  • ?
  • {?"_id"?:?ObjectId("59057c16f551d8c9003d31df"),?"name"?:?"jack",?"grades"?:?[?44,?55?]?}??
  • $exists

    如果 $exists 的值為 true ,選擇存在該字段的文檔,若值為 false 則選擇不包含該字段的文檔

    下面將會查詢不存在sex這一項的信息

  • db.user.find({sex:{$exists:false}})?
  • ?
  • //結果?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cd"),?"name"?:?"xiaoming",?"age"?:?33,?"tags"?:?[?"python",?"java"?],??
  • "grades"?:?[?66,?22,?44,?88?],?"school"?:?{?"name"?:?"kuangda",?"city"?:?"xuzhou"?}?}?
  • ?
  • ?
  • db.user.find({sex:{$exists:true}});?
  • ?
  • //結果?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cb"),?"name"?:?"jack",?"age"?:?22,?"sex"?:?"Man",?"tags"?:?[?"python",?"c++",?"c"?],??
  • "grades"?:?[?22,?33,?44,?55?],?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cc"),?"name"?:?"jhon",?"age"?:?33,?"sex"?:?null,?"tags"?:?[?"python",?"java"?],??
  • "grades"?:?[?66,?22,?44,?88?],?"school"?:?{?"name"?:?"kuangda",?"city"?:?"xuzhou"?}?}??
  • $or

    執行邏輯 OR 運算,指定一個至少包含兩個表達式的數組,選擇出至少滿足數組中一條表達式的文檔。

    語法: { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

    下面將要查找 age 等于 22 或者 age 等于 33 的值

  • db.user.find({$or:[{age:22},{age:33}]})?
  • ?
  • //結果?
  • ?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cb"),?"name"?:?"jack",?"age"?:?22,?"sex"?:?"Man",?"tags"?:?[?"python",?"c++",?"c"?],??
  • "grades"?:?[?22,?33,?44,?55?],?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cc"),?"name"?:?"jhon",?"age"?:?33,?"sex"?:?null,?"tags"?:?[?"python",?"java"?],??
  • "grades"?:?[?66,?22,?44,?88?],?"school"?:?{?"name"?:?"kuangda",?"city"?:?"xuzhou"?}?}?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cd"),?"name"?:?"xiaoming",?"age"?:?33,?"tags"?:?[?"python",?"java"?],??
  • "grades"?:?[?66,?22,?44,?88?],?"school"?:?{?"name"?:?"kuangda",?"city"?:?"xuzhou"?}?}??
  • 下面將會查找出年齡為22或者33并且姓名為 jack 的人的信息

  • db.user.find({name:'jack',$or:[{age:33},{age:22}]})?
  • ?
  • //結果?
  • ?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cb"),?"name"?:?"jack",?"age"?:?22,?"sex"?:?"Man",?"tags"?:?[?"python",?"c++",?"c"?],??
  • "grades"?:?[?22,?33,?44,?55?],?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}??
  • $and

    指定一個至少包含兩個表達式的數組,選擇出滿足該數組中所有表達式的文檔。 $and 操作符使用短路操作,若第一個表達式的值為“ false ”,余下的表達式將不會執行。

    語法: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

    下面將會查找年齡在 20-30 之間的信息,對于下面使用逗號分隔符的表達式列表, MongoDB會提供一個隱式的 $and 操作:

  • db.user.find({$and:[{age:{$gt:20}},{age:{$lt:30}}]})?
  • //上述語句相當于db.user.find({age:{$gt:20},age:{$lt:30}})?
  • ?
  • //結果?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cb"),?"name"?:?"jack",?"age"?:?22,?"sex"?:?"Man",?"tags"?:?[?"python",?"c++",?"c"?],??
  • "grades"?:?[?22,?33,?44,?55?],?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}?
  • $in

    匹配鍵值等于指定數組中任意值的文檔。類似 sql 中 in ,只要匹配一個 value 就會輸出

    語法: { field: { $in: [<value1>, <value2>, ... <valueN> ] } }

    下面將會查找grades中存在22,33之間的任意一個數的信息

  • ?db.user.find({grades:{$in:[22,33]}})?
  • ??
  • ?//輸出?
  • ??
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cb"),?"name"?:?"jack",?"age"?:?22,?"sex"?:?"Man",?"tags"?:?[?"python",?"c++",?"c"?],??
  • "grades"?:?[?22,?33,?44,?55?],?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cc"),?"name"?:?"jhon",?"age"?:?33,?"sex"?:?null,?"tags"?:?[?"python",?"java"?],??
  • "grades"?:?[?66,?22,?44,?88?],?"school"?:?{?"name"?:?"kuangda",?"city"?:?"xuzhou"?}?}?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cd"),?"name"?:?"xiaoming",?"age"?:?33,?"tags"?:?[?"python",?"java"?],??
  • "grades"?:?[?66,?22,?44,?88?],?"school"?:?{?"name"?:?"kuangda",?"city"?:?"xuzhou"?}?}??
  • $nin

    匹配鍵不存在或者鍵值不等于指定數組的任意值的文檔。類似 sql 中 not in (SQL中字段不存在使用會有語法錯誤).

    查詢出 grades 中不存在100或者44的文檔

  • db.user.find({grades:{$nin:[100,44]}})?
  • $not

    執行邏輯 NOT 運算,選擇出不能匹配表達式的文檔 ,包括沒有指定鍵的文檔。 $not 操作符不能獨立使用,必須跟其他操作一起使用

    語法:{ field: { $not: { } } }

    查詢年齡不大于30的信息

  • db.user.find({age:{$not:{$gt:30}}})?
  • ?
  • //輸出?
  • {?"_id"?:?ObjectId("59058460fe58ed1089f2a5cb"),?"name"?:?"jack",?"age"?:?22,?"sex"?:?"Man",?"tags"?:?[?"python",?"c++",?"c"?],??
  • "grades"?:?[?22,?33,?44,?55?],?"school"?:?{?"name"?:?"shida",?"city"?:?"xuzhou"?}?}??

  • 本文作者:Chenjiabing

    來源:51CTO

    總結

    以上是生活随笔為你收集整理的MongoDB干货篇之查询数据的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。