MongoDB查詢內(nèi)嵌文檔

一、概述

   有兩種方法可以查詢內(nèi)嵌文檔:查詢整個文檔蔓同;針對鍵值對進行查詢镶摘。這兩種方式是不同的悴务,下面我通過例子進行分別說明渴析。

二梭稚、查詢整個文檔

例如:有如下文檔

class GoalReportMongoModel(Document):

    id = StringField(primary_key=True)
    user_id = StringField()
    date = StringField()
    update_time = LongField()
    goals = ListField()
    leader_id = StringField()
    comment = StringField()
    checked = BooleanField()
    check_time = LongField()

參考示例:查詢date 為2016-08-05 user_id 為U06UGFL12
可以這樣查詢

db.getCollection("goal_report").find({date:'2016-08-05',user_id:'U06UGFL12'})

這種查詢會去精確匹配整個內(nèi)嵌文檔

三箱玷、鍵值對查詢

我們一般在查詢時怨规,不會去匹配整個內(nèi)嵌文檔,通常只針對內(nèi)嵌文檔的特定鍵值去查詢锡足。怎么做波丰?

答:查詢文檔時,可以使用"."來表示進入內(nèi)嵌文檔舶得。

參考實例:

 db.getCollection("goal_report").find({"goals.goal":'價值目標COO-1',"goals.assigner":'san.zhang'})

查詢結(jié)果

{ 
    "_id" : "U06UGFL12_2016-08-05", 
    "user_id" : "U06UGFL12", 
    "date" : "2016-08-05", 
    "update_time" : NumberLong(1470397732), 
    "goals" : [
        {
            "status" : "ensure", 
            "criterion_ok" : true, 
            "user_id" : "U06UGFL12", 
            "goal" : "價值目標COO-1", 
            "assigner" : "san.zhang", 
            "tool" : "", 
            "method_ok" : true, 
            "done_time" : NumberInt(0), 
            "method" : "", 
            "reason" : "本周",
            "criterion" : "", 
            "goal_type" : "valuable", 
            "expire_time" : NumberInt(0), 
            "execution" : NumberInt(2), 
            "id" : NumberInt(1135241564), 
            "planh" : ""
        }, 
       {
            "status" : "ensure", 
            "criterion_ok" : true, 
            "user_id" : "U06UGF232", 
            "goal" : "價值目標COO-2", 
            "assigner" : "san.zhang", 
            "tool" : "", 
            "method_ok" : true, 
            "done_time" : NumberInt(0), 
            "method" : "", 
            "reason" : "本周",
            "criterion" : "", 
            "goal_type" : "valuable", 
            "expire_time" : NumberInt(0), 
            "execution" : NumberInt(2), 
            "id" : NumberInt(1135241564), 
            "planh" : ""
        }, 

    ], 
    "leader_id" : "U08EC7FTM", 
    "checked" : true
}

四掰烟、數(shù)組里面包含內(nèi)嵌文檔的查詢

這種查詢相對來說比較復雜一點,所以內(nèi)嵌文檔的匹配也需要有些技巧沐批。例如下面的博客文檔中有一個commens:鍵用來保存別人的評論信息纫骑。

db.blog.insert({  
    "_id":"B001",  
    "title":"MongoDB查詢",  
    "comments":[  
      {"name":"ickes","score":3,"comment":"nice"},  
      {"name":"xl","score":4,"comment":"nice"},  
      {"name":"eksliang","score":5,"comment":"nice"},  
      {"name":"ickes","score":6,"comment":"nice"}  
    ]  
})  

現(xiàn)在要查詢由ickes評論的且5分以上文章

- 不能使用db.blog.find({"comments":{"name":"ickes","score":{"$gt":5}})去查,因為內(nèi)嵌文檔的匹配是精確匹配九孩,必須要匹配完整的文檔先馆,而這個查詢不會匹配comment鍵

-  不能使用db.blog.find({"comments":{"name":"ickes","score":{ '$gt' : 5},"comment":"nice"}})去查,還是那句話躺彬,文檔的匹配時精確匹配煤墙,這里使用了$gt作為范圍梅惯,所以也查不到

- 不能使用db.blog.find({"comments.name":"ickes","comments.score":{"$gt":5}})去查,前面講查詢條件的時候說過仿野,查詢條件里面的鍵值對會解釋為AND,但是對于數(shù)組的內(nèi)嵌文檔他會解釋為OR的關系铣减,也就是說上面實際是這樣的comments.name:ickes或者comments.score":{"$gt":5},這明顯不行嗎!(注意如果內(nèi)嵌文檔不在數(shù)組中脚作,還是AND葫哗,所以我才把這個拿出來單獨討論)

那對于數(shù)組里面的內(nèi)嵌文檔到底怎么辦?應該這么辦球涛,如下所示

這里需要使用"$elemMatch"操作符魄梯,僅當這種時候才使用這個操作符

db.blog.find({"comments":{  
    "$elemMatch":{"name":"ickes","score":{"$gt":5}}  
}})  

五、返回與查詢條件相匹配的任意一個數(shù)組元素

   我們可以使用"$slice"操作符進行數(shù)組元素返回限制宾符,但是當數(shù)組里面保存的是文檔的時候,我就想返回與我查詢條件相匹配的那個元素灭翔,其他的不要魏烫,怎么做?有技巧的哦肝箱!

文檔結(jié)構(gòu)如下:

db.blog.insert({  
    "_id":"B001",  
    "title":"MongoDB查詢",  
    "comments":[  
      {"name":"ickes","score":3,"comment":"nice"},  
      {"name":"xl","score":4,"comment":"nice"},  
      {"name":"eksliang","score":5,"comment":"nice"},  
      {"name":"ickes","score":6,"comment":"nice"}  
    ]  
})  

參考實例:

db.blog.find({"comments":{  
   "$elemMatch":{"name":"ickes","score":{"$gt":5}}}},  
   {"comments.$":1}--第二個參數(shù)是限制返回數(shù)據(jù)的哄褒,別看錯了,這是第二個參數(shù)  
)  

返回結(jié)果如下:僅返回與當前查詢條件相匹配的那個內(nèi)嵌文檔煌张。

{  
  "_id" : "B001",   
  "comments" : [ { "name" : "ickes", "score" : 6, "comment" : "nice" } ]   
}  

如果當前查詢有多個內(nèi)嵌文檔匹配呐赡,只會返回第一個

六、按照正則表達式查詢內(nèi)嵌文檔某個字段包含某個字符串

舉例:

{ 
    "_id" : "U08G7H48Y_2016-07-08", 
    "user_id" : "U08G7H48Y", 
    "date" : "2016-07-08", 
    "update_time" : NumberLong(1467978750), 
    "goals" : [
        {
            "status" : "unsure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "價值目標:確保IA項目組盈利指標達標", 
            "assigner" : "", 
            "tool" : "", 
            "method_ok" : true, 
            "id" : NumberInt(1363999581), 
            "done_time" : NumberInt(0), 
            "reason" : "短期目標不能確保:找不到更好的拿新用戶的方法", 
            "create_time" : NumberLong(1466508766869), 
            "criterion" : "確保每天收入達到5w骏融,力爭6w\nFollow:1w\nLike:1.5w\nTracker:0.5w\nPrivacy:1.5w\nMemoryBoost:1.5w", 
            "expire_time" : NumberInt(0), 
            "execution" : NumberInt(2), 
            "method" : "已經(jīng)入思維導圖链嘀。\n確保7月30日收入達到1.5w", 
            "planh" : ""
        }, 
        {
            "status" : "ensure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "價值目標:確保給組員制造W-W局面", 
            "assigner" : "", 
            "tool" : "Wunderlist", 
            "method_ok" : true, 
            "id" : NumberLong(2633899071), 
            "done_time" : NumberInt(0), 
            "reason" : "", 
            "create_time" : NumberLong(1465283369329), 
            "criterion" : "幫助管理者(李丁,時遷档玻,賈博怀泊,盧燕濤,孟友陽)盯住他的組員", 
            "expire_time" : NumberInt(0), 
            "execution" : NumberInt(1), 
            "method" : "確保增加項目負責人的管理組員能力:\n李丁每兩周跟我Review一下他的組員:需要設置李丁的ToDo\n時遷每兩周跟我Review一下他的組員:需要設置時遷的ToDo\n盧燕濤每兩周跟我Review一下他的組員:需要設置盧燕濤的ToDo\n孟友陽每周跟我Review一下他的組員:需要設置孟友陽的ToDo\n\n確保跟每個PM每個季度至少聊天一次: 已設置Review聊天記錄的todo", 
            "planh" : ""
        }, 
        {
            "status" : "unsure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "價值目標:確保PM可以流動起來", 
            "assigner" : "", 
            "tool" : "", 
            "method_ok" : true, 
            "id" : NumberInt(602193464), 
            "done_time" : NumberInt(0), 
            "reason" : "最近入職PM比較難误趴,感覺流動這個目標會看不住", 
            "create_time" : NumberLong(1465284005711), 
            "criterion" : "確保組內(nèi)PM新老搭配合理\n確保組內(nèi)新PM快速培訓", 
            "expire_time" : NumberInt(0), 
            "execution" : 1.5, 
            "method" : "確保7月底之前輸入兩個pm", 
            "planh" : ""
        }, 
        {
            "status" : "ensure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "價值目標:確保項目組流程完善", 
            "assigner" : "", 
            "tool" : "", 
            "method_ok" : true, 
            "id" : NumberInt(1616685108), 
            "done_time" : NumberInt(0), 
            "reason" : "", 
            "create_time" : NumberLong(1465284199829), 
            "criterion" : "確保項目組DEV流程完善", 
            "expire_time" : NumberInt(0), 
            "execution" : 1.5, 
            "method" : "確保項目組DEV流程完善", 
            "planh" : ""
        }, 
        {
            "status" : "unsure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "價值目標:確保項目組執(zhí)行力達到1X", 
            "assigner" : "", 
            "tool" : "", 
            "method_ok" : false, 
            "id" : NumberLong(4283629091), 
            "done_time" : NumberInt(0), 
            "reason" : "暫時沒有找到好的方法確保這個目標", 
            "create_time" : NumberLong(1465284143431), 
            "criterion" : "MB每周提交一個版本\nPM每周提交一個版本\niOS每兩完成一個Feature", 
            "expire_time" : NumberInt(0), 
            "execution" : NumberInt(2), 
            "method" : "每個單子Archive的時候要想一些是否需要rethink", 
            "planh" : ""
        }, 
        {
            "status" : "ensure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "價值目標:確保盯住競爭對手的程序", 
            "assigner" : "", 
            "tool" : "Wunderlist", 
            "method_ok" : true, 
            "id" : NumberLong(3852562557), 
            "done_time" : NumberInt(0), 
            "reason" : "", 
            "create_time" : NumberLong(1465283982245), 
            "criterion" : "確迸恚看榜單,Like凉当,Tracker等競品", 
            "expire_time" : NumberInt(0), 
            "execution" : 1.5, 
            "method" : "確保每", 
            "planh" : ""
        }, 
        {
            "status" : "ensure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "焦點目標", 
            "assigner" : "", 
            "tool" : "Wunderlist", 
            "method_ok" : true, 
            "id" : NumberInt(1973727620), 
            "done_time" : NumberInt(0), 
            "reason" : "", 
            "create_time" : NumberLong(1465284255588), 
            "criterion" : "確保關鍵字推廣在持續(xù)推進", 
            "expire_time" : NumberInt(1469808000), 
            "execution" : 1.5, 
            "method" : "推廣ROI", 
            "planh" : ""
        }, 
        {
            "status" : "unsure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "焦點目標:確保", 
            "assigner" : "", 
            "tool" : "", 
            "method_ok" : true, 
            "id" : NumberInt(123662851), 
            "done_time" : NumberInt(0), 
            "reason" : "這周上線的時候枣申。", 
            "create_time" : NumberLong(1465278975537), 
            "criterion" : "交叉", 
            "expire_time" : NumberInt(1467216000), 
            "execution" : NumberInt(2), 
            "method" : "詳見思維導圖", 
            "planh" : ""
        }, 
        {
            "status" : "ensure", 
            "user_id" : "U08G7H48Y", 
            "goal" : "焦點目標:確保跟進產(chǎn)品需求,多跟PM討論各種產(chǎn)品需求", 
            "assigner" : "", 
            "tool" : "", 
            "method_ok" : true, 
            "id" : NumberLong(3918152115), 
            "done_time" : NumberInt(0), 
            "reason" : "", 
            "create_time" : NumberLong(1467335980569), 
            "criterion" : "確保每天至少找一個PM討論需求15分鐘\n確保每次產(chǎn)品需求評審會都參加", 
            "expire_time" : NumberInt(0), 
            "execution" : NumberInt(2), 
            "method" : "每天至少找一個PM討論需求15分鐘看杭,已經(jīng)入todo\n", 
            "planh" : ""
        }
    ], 
    "leader_id" : "U06UGFL12", 
    "comment" : "個人產(chǎn)品能力和", 
    "check_time" : NumberLong(1468158420)
}

mongo 原生代碼查詢

db.getCollection("goal_report").find({"goals":{"$elemMatch":{"goal":{"$regex":/價值目標/}}}})

mongoengine 查詢

GoalReportMongoModel.objects(__raw__={"goals":{"$elemMatch":{"goal":{"$regex":'價值目標'}}}})

七忠藤、 查詢數(shù)組

數(shù)組元素模糊匹配

數(shù)組字段badges每個包含該元素black的文檔都將被返回

db.users.find({badges:"black"},{"_id":1,badges:1})
# 結(jié)果
        { "_id" : 1, "badges" : [ "blue", "black" ] }
        { "_id" : 4, "badges" : [ "red", "black" ] }
        { "_id" : 6, "badges" : [ "black", "blue" ] }
數(shù)組元素精確(全)匹配

數(shù)組字段badges的值為["black","blue"]的文檔才能被返回(數(shù)組元素值和元素順序全匹配)

 db.users.find({badges:["black","blue"]},{"_id":1,badges:1})
#結(jié)果
        { "_id" : 6, "badges" : [ "black", "blue" ] }
數(shù)組內(nèi)嵌文檔查詢

查詢數(shù)組points內(nèi)嵌文檔鍵points的值小于等于55的文檔,此處通過.成員的方式實現(xiàn)

db.users.find( { 'points.points': { $lte: 55}},{"_id":1,points:1})
# 結(jié)果
        { "_id" : 3, "points" : [ { "points" : 81, "bonus" : 8 }, { "points" : 55, "bonus" : 20 } ] }
        { "_id" : 4, "points" : [ { "points" : 53, "bonus" : 15 }, { "points" : 51, "bonus" : 15 } ] }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楼雹,一起剝皮案震驚了整個濱河市熄驼,隨后出現(xiàn)的幾起案子像寒,更是在濱河造成了極大的恐慌,老刑警劉巖瓜贾,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诺祸,死亡現(xiàn)場離奇詭異,居然都是意外死亡祭芦,警方通過查閱死者的電腦和手機筷笨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龟劲,“玉大人胃夏,你說我怎么就攤上這事〔” “怎么了仰禀?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚕愤。 經(jīng)常有香客問我答恶,道長,這世上最難降的妖魔是什么萍诱? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任悬嗓,我火速辦了婚禮,結(jié)果婚禮上裕坊,老公的妹妹穿的比我還像新娘包竹。我一直安慰自己,他們只是感情好籍凝,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布周瞎。 她就那樣靜靜地躺著,像睡著了一般饵蒂。 火紅的嫁衣襯著肌膚如雪堰氓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天苹享,我揣著相機與錄音双絮,去河邊找鬼。 笑死得问,一個胖子當著我的面吹牛囤攀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宫纬,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼焚挠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漓骚?” 一聲冷哼從身側(cè)響起蝌衔,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤榛泛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后噩斟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曹锨,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年剃允,在試婚紗的時候發(fā)現(xiàn)自己被綠了沛简。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡斥废,死狀恐怖椒楣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牡肉,我是刑警寧澤捧灰,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站统锤,受9級特大地震影響毛俏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跪另,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煤搜。 院中可真熱鬧免绿,春花似錦、人聲如沸擦盾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迹卢。三九已至辽故,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腐碱,已是汗流浹背誊垢。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留症见,地道東北人喂走。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像谋作,于是被迫代替她去往敵國和親芋肠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容