pymongo操作指南

更新操作update

在實際中,更新文檔往往是更新文檔的一部分內(nèi)容氨淌,在 MongoDB 中泊愧,我們可以使用更新修改器 (update modifier) 來對文檔中某些字段進行更新,常用的修改器有以下幾個:

  • $set用來指定一個字段的值盛正,如果不存在删咱,將創(chuàng)建一個新的字段
  • $unset刪除一個字段
  • $inc用來增加(或減少)一個已有鍵的值,如果不存在將會創(chuàng)建一個
  • $push 向已有的數(shù)組末尾添加一個元素
  • $addToSet避免插入重復(fù)數(shù)據(jù)
  • $pull刪除元素豪筝,基于特定條件
  • $each遍歷列表操作
  • $pop刪除元素

$set

>> document = {'name': 'joe', 
               'age': 30,
               'sex': 'male',
               'location': 'Wisconsin' }

>> table.insert_one(document)

>> print(user.find_one({'_id':'5ac9836829561f64220f6f9d'}))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

# 為用戶添加一項 favorite 的字段
>> table.update_one({'_id': ObjectId('5ac9836829561f64220f6f9d')}, {'$set' : {'favorite': 'War adn Peace'}})

>> print(table.find_one({'_id':'5ac9836829561f64220f6f9d'}))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'favorite': 'War adn Peace',
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

# 將 favorite 字段的值修改為 Green Eggs and Ham
>> table.update_one({'name': 'joe'}, {'$set': {'favorite': 'Green Eggs and Ham'}})

>> print(user.find_one({'_id':'5ac9836829561f64220f6f9d'}))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'favorite': 'Green Eggs and Ham',
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

# 將 favorite 字段的值替換為一個數(shù)組
>> table.update_one({'name': 'joe'}, {'$set': {'favorite': ["Cat's Cradle": , "Foundation Trilogy", "Ender's Game"]}})

>> print(user.find_one({'_id':'5ac9836829561f64220f6f9d'}))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'favorite': ["Cat's Cradle", 'Foundation Trilogy', "Ender's Game"],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

# 內(nèi)嵌文檔修改
>> blog = database.blog # 創(chuàng)建一個 blog 集合

>> posts = {'title': 'A Blog Post', 'content': '...', 'author': {'name': 'joe', 'email': 'joe@example.com'}} # 創(chuàng)建一個 posts 文檔

>> blog.insert_one(posts)

>> blog.find_one({'title':'A Blog Post'})

>> {'_id': ObjectId('5ac98a0a29561f64220f6f9e'),
    'author': {'email': 'joe@example.com', 'name': 'joe'},
    'content': '...',
    'title': 'A Blog Post'}

# 將作者名稱字段 name 的值修改為 joe schmoe
>> blog.update_one({'author.name': 'joe'}, {'$set': {'author.name': 'joe schmoe'}})
>> blog.find_one()
>> {'_id': ObjectId('5ac98a0a29561f64220f6f9e'),
    'author': {'email': 'joe@example.com', 'name': 'joe schmoe'},
    'content': '...',
    'title': 'A Blog Post'}

$unset

# 刪除 table集合中 joe 的 favorite 字段
>> print(table.find_one({'_id':'5ac9836829561f64220f6f9d'}))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'favorite': ["Cat's Cradle", 'Foundation Trilogy', "Ender's Game"],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}
>> table.update_one({'name': 'joe'}, {'$unset': {'favorite': 1}})

>> print(table.find_one({'_id':'5ac9836829561f64220f6f9d'}))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

$inc

# 創(chuàng)建一個 games 的集合痰滋,并向集合中添加數(shù)據(jù)
>> games = test_database.games

>> games.insert_one({'game': 'pinball', 'user': 'joe'})

>> print(games.find_one('_id':'5ac9c55f29561f64220f6f9f'))

>> {'_id': ObjectId('5ac9c55f29561f64220f6f9f'), 'game': 'pinball', 'user': 'joe'}

# 增加一個分數(shù)字段 score
>> games.update_one({'game': 'pinball', 'user': 'joe'}, {'$inc': {'score': 50}})

>> print(games.find_one('_id':'5ac9c55f29561f64220f6f9f'))

>> {'_id': ObjectId('5ac9c55f29561f64220f6f9f'),
    'game': 'pinball',
    'score': 50,
    'user': 'joe'}

# 為 score 字段的值增加 5000
>> games.update_one({'game': 'pinball', 'user': 'joe'}, {'$inc': {'score': 5000}})

>> print(games.find_one('_id':'5ac9c55f29561f64220f6f9f'))

>> {'_id': ObjectId('5ac9c55f29561f64220f6f9f'),
    'game': 'pinball',
    'score': 5050,
    'user': 'joe'}

$push

# 選擇 blog 數(shù)據(jù)庫
>> blog = test_database.blog

>> print(blog.find_one('_id':'5ac98a0a29561f64220f6f9e'))

>> {'_id': ObjectId('5ac98a0a29561f64220f6f9e'),
    'author': {'email': 'joe@example.com', 'name': 'joe schmoe'},
    'content': '...',
    'title': 'A Blog Post'}

# 添加一項評論字段 comment
>> blog.update_one({'title': 'A Blog Post'},
                   {'$push' : {'comments': {'name': 'joe', 'email': 'joe@example.com', 'content': 'nice post.'}}})

>> print(blog.find_one('_id':'5ac98a0a29561f64220f6f9e'))

>> {'_id': ObjectId('5ac98a0a29561f64220f6f9e'),
    'author': {'email': 'joe@example.com', 'name': 'joe schmoe'},
    'comments': [{'content': 'nice post.', 'email': 'joe@example.com', 'name': 'joe'}],
    'content': '...',
    'title': 'A Blog Post'}

# 在添加一條由 bob 發(fā)表的評論
>> blog.update_one({'title': 'A Blog Post'},
                   {'$push' : {'comments': {'name': 'bob', 'email': 'bob@example.com', 'content': 'good post.'}}})

>> print(blog.find_one('_id':'5ac98a0a29561f64220f6f9e'))

>> {'_id': ObjectId('5ac98a0a29561f64220f6f9e'),
    'author': {'email': 'joe@example.com', 'name': 'joe schmoe'},
    'comments': [{'content': 'nice post.','email': 'joe@example.com', 'name': 'joe'},
                 {'content': 'good post.', 'email': 'bob@example.com', 'name': 'bob'}],
    'content': '...',
    'title': 'A Blog Post'}

$addToSet

# 為 user 集合中的 joe 文檔添加 emails 字段
>> print(table.find_one('_id':'5ac9836829561f64220f6f9d'))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

>> table.update_one({'name': 'joe'},{'$push': {'emails': 'joe@example.com'}})

>> table.update_one({'name': 'joe'},{'$push': {'emails': 'joe@gmail.com'}})

>> print(table.find_one('_id':'5ac9836829561f64220f6f9d'))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'emails': ['joe@example.com', 'joe@gmail.com'],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

# 使用 $addToSet 再添加一項 joe@example.com 的記錄,因為存在重復(fù)续崖,數(shù)據(jù)不會被重復(fù)添加
>> table.update_one({'name': 'joe'}, {'$addToSet': {'emails': 'joe@example.com'}})

>> print(table.find_one('_id':'5ac9836829561f64220f6f9d'))
>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'emails': ['joe@example.com', 'joe@gmail.com'],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

# 如果直接使用 $push 敲街,記錄會被重復(fù)添加
>> table.update_one({'name': 'joe'}, {'$push': {'emails': 'joe@example.com'}})

>> print(table.find_one('_id':'5ac9836829561f64220f6f9d'))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'emails': ['joe@example.com', 'joe@gmail.com', 'joe@example.com'],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

$pull

# 刪除 table集合中 joe 文檔指定的 emails 值 ($pull 會刪除所有符合條件的記錄)
>> table.update_one({'name': 'joe'}, {'$pull': {'emails': 'joe@example.com'}})

>> print(table.find_one('_id':'5ac9836829561f64220f6f9d'))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'emails': ['joe@gmail.com'],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

$each

# 向 table集合中 joe 文檔的 emails 字段追加兩個郵箱地址
>> table.update_one({'name': 'joe'}, {'$push': {'emails': {'$each': ['joe@example.com', 'joe@outlook.com']}}})

>> print(table.find_one('_id':'5ac9836829561f64220f6f9d'))

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'emails': ['joe@gmail.com', 'joe@example.com', 'joe@outlook.com'],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

$pop

>> table.find_one({'_id':'5ac9836829561f64220f6f9d'})

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'emails': ['joe@gmail.com', 'joe@example.com', 'joe@outlook.com'],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

# 刪除集合 user 中 joe 文檔 emails 字段下的第一個郵箱地址
>> table.update_one({'name': 'joe'}, {'$pop': {'emails': -1}})

>> table.find_one({'_id':'5ac9836829561f64220f6f9d'})

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'emails': ['joe@example.com', 'joe@outlook.com'],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

# 刪除集合 user 中 joe 文檔 emails 字段下的最后一個郵箱地址
>> table.update_one({'name': 'joe'}, {'$pop': {'emails': 1}})

>> table.find_one({'_id':'5ac9836829561f64220f6f9d'})

>> {'_id': ObjectId('5ac9836829561f64220f6f9d'),
    'age': 30,
    'emails': ['joe@example.com'],
    'location': 'Wisconsin',
    'name': 'joe',
    'sex': 'male'}

基于位置的數(shù)組修改器

如果文檔中存在數(shù)組記錄,而且數(shù)組記錄有多個值严望,我們可以視同位置修改器或者定位符 $ 來修改數(shù)組其中的某些值多艇。

# 添加一條 posts 記錄
>> posts = {'content': '...', 
            'comments': [{'comment': 'good post', 'author': 'John', 'votes': 0},
                         {'comment': 'i thought it was too short', 'author': 'Claire', 'votes': 3},
                         {'comment': 'free watches', 'auth: or': 'Alice', 'votes': -1}]}

>> blog.insert_one(posts)
>> blog.find_one({'_id':'5aca17cf29561f64220f6fa0'})

>> {'_id': ObjectId('5aca17cf29561f64220f6fa0'),
    'comments': [{'author': 'John', 'comment': 'good post', 'votes': 0},
                 {'author': 'Claire', 'comment': 'i thought it was too short', 'votes': 3},
                 {'author': 'Alice', 'comment': 'free watches', 'votes': -1}],
    'content': '...'}

# 為第一條評論 comments 的 votes 字段增加 1
 # comments的第0個位置的votes值增加1
>> blog.update_one({'_id': '5aca17cf29561f64220f6fa0'}, {'$inc': {'comments.0.votes': 1}}) 

>> blog.find_one({'_id':'5aca17cf29561f64220f6fa0'})

>> {'_id': ObjectId('5aca17cf29561f64220f6fa0'),
    'comments': [{'author': 'John', 'comment': 'good post', 'votes': 1},
                 {'author': 'Claire', 'comment': 'i thought it was too short', 'votes': 3},
                 {'author': 'Alice', 'comment': 'free watches', 'votes': -1}],
    'content': '...'}

# 定位符的使用,通常在不知道具體數(shù)組位置著蟹,使用定位符$墩蔓,定位查詢文檔來匹配數(shù)組元素
>> blog.update_one({'comments.author': 'John'}, {'$set': {'comments.$.author': 'Jim'}})

>> blog.find_one({'_id':'5aca17cf29561f64220f6fa0'})

>> {'_id': ObjectId('5aca17cf29561f64220f6fa0'),
    'comments': [{'author': 'Jim', 'comment': 'good post', 'votes': 1},
                 {'author': 'Claire', 'comment': 'i thought it was too short', 'votes': 3},
                 {'author': 'Alice', 'comment': 'free watches', 'votes': -1}],
    'content': '...'}

條件查詢

比較操作符

  • $lt小于
  • $lte小于等于
  • $ge大于
  • $gte大于等于
  • $ne 不等于
# 先遍歷打印 table集合中的數(shù)據(jù)
>> for data in table.find():
      print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa1'), 'name': 'joe', 'age': 26}
   {'_id': ObjectId('5acb225729561f64220f6fa2'), 'name': 'mike', 'age': 28}
   {'_id': ObjectId('5acb225729561f64220f6fa3'), 'name': 'jake', 'age': 26}

# 查詢大于 26 歲的用戶
>> for data in table.find({'age': {'$gt': 26}}):
    print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa2'), 'name': 'mike', 'age': 28}

# 查詢大于等于 26 歲的用戶
>> for data in table.find({'age': {'$gte': 26}}):
      print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa1'), 'name': 'joe', 'age': 26}
   {'_id': ObjectId('5acb225729561f64220f6fa2'), 'name': 'mike', 'age': 28}
   {'_id': ObjectId('5acb225729561f64220f6fa3'), 'name': 'jake', 'age': 26}

# 查詢小于 28 歲的用戶
>> for data in table.find({'age': {'$lt': 28}}):
      print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa1'), 'name': 'joe', 'age': 26}
   {'_id': ObjectId('5acb225729561f64220f6fa3'), 'name': 'jake', 'age': 26}

# 查詢小于等于 28 歲的用戶
>> for data in table.find({'age': {'$lte': 28}}):
    print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa1'), 'name': 'joe', 'age': 26}
   {'_id': ObjectId('5acb225729561f64220f6fa2'), 'name': 'mike', 'age': 28}
   {'_id': ObjectId('5acb225729561f64220f6fa3'), 'name': 'jake', 'age': 26}

# 查詢不等于 28 歲的用戶
>> for data in table.find({'age': {'$ne': 28}}):
      print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa1'), 'name': 'joe', 'age': 26}
   {'_id': ObjectId('5acb225729561f64220f6fa3'), 'name': 'jake', 'age': 26}

$in$nin 的用法

使用 $in$nin 操作符來匹配一個鍵的多個值梢莽。

# 匹配 table集合中 用戶名為 joe 和 mike 的文檔記錄
>> for data in table.find({'name': {'$in': ['joe', 'mike']}}):
      print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa1'), 'name': 'joe', 'age': 26}
   {'_id': ObjectId('5acb225729561f64220f6fa2'), 'name': 'mike', 'age': 28}

# 匹配用戶名不是 mike 的用戶 注意: $in 和 $nin 條件必須是一個數(shù)組
>> for data in table.find({'name': {'$nin': ['mike']}}):
      print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa1'), 'name': 'joe', 'age': 26}
   {'_id': ObjectId('5acb225729561f64220f6fa3'), 'name': 'jake', 'age': 26}

$or 的用法

如果需要查詢兩個條件中其中一個為真的查詢結(jié)果,可以使用 $or 操作符奸披。

# 為方便演示昏名,我們先插入多一條文檔記錄
>> kate = {'name': 'kate', 'age': 30}
>> table.insert_one(kate)
>> for data in table.find({'$or': [{'name': 'mike'}, {'age': 30}]}):
      print(data)
>> {'_id': ObjectId('5acb225729561f64220f6fa2'), 'name': 'mike', 'age': 28}
   {'_id': ObjectId('5acb6cfc29561f64220f6fa4'), 'name': 'kate', 'age': 30}

null 值查詢和$exists條件判定

在 Python 中,mongodb 中的 null 值以 None 表示阵面。但在查詢 null 值中轻局,會出現(xiàn)比較奇怪的情況。

# 為方便演示样刷,創(chuàng)建一個 c 集合仑扑,并向里面添加 3 條記錄
>> c = test_database.c
>> c.insert_many({'y': None}, {'y': 1}, {'y': 2})

>> for data in c.find():
      print(data)
>> {'_id': ObjectId('5acb738029561f64220f6fa5'), 'y': None}
   {'_id': ObjectId('5acb741029561f64220f6fa6'), 'y': 1}
   {'_id': ObjectId('5acb741029561f64220f6fa7'), 'y': 2}

# 查詢 null 值
>> for data in c.find({'y': None}):
       print(data)
>> {'_id': ObjectId('5acb738029561f64220f6fa5'), 'y': None}

# 查詢一個不存在的鍵,查詢條件為 null
>> for data in c.find({'z': None}):
      print(data)
>> {'_id': ObjectId('5acb738029561f64220f6fa5'), 'y': None}
   {'_id': ObjectId('5acb741029561f64220f6fa6'), 'y': 1}
   {'_id': ObjectId('5acb741029561f64220f6fa7'), 'y': 2}

可以看到置鼻,當我們查找 {'z': None} 的時候镇饮,會把所有不包含這個條件的文檔都查詢出來,這樣明顯和我們的意圖不一致箕母,因此我們需要增加一個限定储藐。

>> for data in c.find({'z': {'$in': [None], '$exists': 1}}):
      print(data)
>> 

通過加上 $exists 的限定,我們可以看到代碼執(zhí)行完之后并沒有查詢結(jié)果輸出嘶是,符合我們的查詢意圖钙勃。

查詢數(shù)組

  • $all 匹配多個元素數(shù)組
  • $size 匹配特定長度的數(shù)組
  • $slice 返回匹配數(shù)組的一個子集
    為方便演示,我們會先創(chuàng)建一個 food 的集合用來存放水果的文檔記錄聂喇。
>> food = test_database.food

>> food.insert_one({'_id': 1, 'fruit': ['apple', 'banana', 'peach']})
>> food.insert_one({'_id': 2, 'fruit': ['apple', 'kumquat', 'orange']})
>> food.insert_one({'_id': 3, 'fruit': ['cherry', 'banana', 'apple']})

>> for data in food.find():
      print(data)
>> {'_id': 1, 'fruit': ['apple', 'banana', 'peach']}
   {'_id': 2, 'fruit': ['apple', 'kumquat', 'orange']}
   {'_id': 3, 'fruit': ['cherry', 'banana', 'apple']}

$all的用法

>> result = food.find({'fruit': {'$all': ['apple', 'banana']}})

>> for data in result:
      print(data)
>> {'_id': 1, 'fruit': ['apple', 'banana', 'peach']}
   {'_id': 3, 'fruit': ['cherry', 'banana', 'apple']}

# 也可以使用位置定位匹配
>> result = food.find({'fruit.1': 'banana'})

>> for data in result:
      print(data)
>> {'_id': 1, 'fruit': ['apple', 'banana', 'peach']}
   {'_id': 3, 'fruit': ['cherry', 'banana', 'apple']}

$size的用法

>> food.update_one({'_id': 2}, {'$push': {'fruit': 'strawbreey'}})

>> for data in food.find():
      print(data)
>> {'_id': 1, 'fruit': ['apple', 'banana', 'peach']}
   {'_id': 2, 'fruit': ['apple', 'kumquat', 'orange', 'strawbreey']}
   {'_id': 3, 'fruit': ['cherry', 'banana', 'apple']}

# 查找數(shù)組size為3的結(jié)果
>> result = food.find({'fruit': {'$size': 3}})

>> for data in result:
      print(data)
>> {'_id': 1, 'fruit': ['apple', 'banana', 'peach']}
   {'_id': 3, 'fruit': ['cherry', 'banana', 'apple']}

$slice的用法

>> blog.find_one({'_id':'5aca17cf29561f64220f6fa0'})
>> {'_id': ObjectId('5aca17cf29561f64220f6fa0'),
    'comments': [{'author': 'Jim', 'comment': 'good post', 'votes': 1},
                 {'author': 'Claire', 'comment': 'i thought it was too short', 'votes': 3},
                 {'author': 'Alice', 'comment': 'free watches', 'votes': -1}],
    'content': '...'}

# 獲取前兩條評論記錄
>> blog.find_one({}, {'comments': {'$slice': 2}})
>> {'_id': ObjectId('5aca17cf29561f64220f6fa0'),
    'comments': [{'author': 'Jim', 'comment': 'good post', 'votes': 1},
                 {'author': 'Claire', 'comment': 'i thought it was too short', 'votes': 3}],
    'content': '...'}

# 獲取最后一條評論記錄
>> blog.find_one({}, {'comments': {'$slice': -1}})
>> {'_id': ObjectId('5aca17cf29561f64220f6fa0'),
    'comments': [{'author': 'Alice', 'comment': 'free watches', 'votes': -1}],
    'content': '...'}

min()max() 的使用

如果我們以某個區(qū)間值作為查詢條件辖源,我們可以使用比較操作符來實現(xiàn),但是希太,如果文檔中存在值克饶,以及值組成的數(shù)組時,查詢結(jié)果往往與我們的意圖不一致跛十,這是我們就需要用到 $elemMatch 來匹配非數(shù)組元素彤路,或者使用 min() 和 max() 方法秕硝。

# 在 c 集合中加入新的文檔記錄
>> c.insert_many([{'x':  5}, {'x': 15}, {'x': 25}, {'x': [5, 25]}])
>> c.count()
>> 4

>> for data in c.find():
      print(data)
>> {'_id': ObjectId('5acc31c729561f64220f6fa8'), 'x': 5}
   {'_id': ObjectId('5acc31c729561f64220f6fa9'), 'x': 15}
   {'_id': ObjectId('5acc31c729561f64220f6faa'), 'x': 25}
   {'_id': ObjectId('5acc31c729561f64220f6fab'), 'x': [5, 25]}

# 假設(shè)我們需要查詢 [10, 20] 區(qū)間內(nèi)的記錄
>> result = c.find({'x': {'$gt': 10. '$lt': 20}})
>> for data in result:
      print(data)
>> {'_id': ObjectId('5acc31c729561f64220f6fa9'), 'x': 15}
  {'_id': ObjectId('5acc31c729561f64220f6fab'), 'x': [5, 25]}
# 這里看到 [5, 25] 這一條記錄其實是不符合我們的查詢預(yù)期的

# 我們可以使用 $elemMatch 來不匹配非數(shù)組元素
>> result = c.find({'x': {'$elemMatch': {'$gt': 10, '$lt': 20}}})
>> for data in result:
      print(data)
>> // 沒有輸出結(jié)果
# 通過添加 $elemMatch 可以剔除 [5, 25] 這一記錄芥映,但正確的查詢結(jié)果 {'x': 15} 卻不能匹配
# 我們將使用 min() 以及 max() 方法
# 為使用者兩個方法,我們需要先給 c 集合的 x 字段建立索引
>> c.create_index('x')
>> 'x_1'
>> result = c.find({'x': {'$gt': 10, '$lt': 20}}).min([('x', 10)]).max([('x', 20)])
>> for data in result:
      print(data)
>> {'_id': ObjectId('5acc31c729561f64220f6fa9'), 'x': 15}

關(guān)于min()max()兩個方法远豺,有兩點需要注意:

  • 使用這兩個方法前奈偏,必須先要為需要查詢的字段建立索引,否則會報錯
  • 這兩個方法和在 mongodb 中的寫法有一些不一樣躯护,在 mongodb 中惊来,同樣操作寫作:min({'x': 10})但在 Pymongo 中,應(yīng)寫成min([(‘x’, 10)])注意區(qū)別棺滞,否則同樣會報錯裁蚁。

$where 查詢

針對一些比較復(fù)雜的查詢矢渊,我們可以使用 $where 。然而枉证,由于$where 可以在查詢中執(zhí)行任意的 Javascript矮男,因此可能會產(chǎn)生出一些不安全的操作,因此室谚,在實際生產(chǎn)環(huán)境中毡鉴,竟可能的不用或者禁用$where

# 向 foo 集合中添加兩條文檔記錄
>> foo.insert_one({'apple': 1, 'banana': 6, 'peach': 3})
>> foo.insert_one({'apple': 8, 'spinach': 4, 'watermelon': 4})

>> for data in foo:
      print(data)
>> {'_id': ObjectId('5acdbf4729561f64220f6fac'), 'apple': 1, 'banana': 6, 'peach': 3}
   {'_id': ObjectId('5acdbf6a29561f64220f6fad'), 'apple': 8, 'spinach': 4, 'watermelon': 4}

# 接下來秒赤,我們需要查找存在兩個水果數(shù)量相等的文檔
>> result = foo.find({'$where':
    """
      function() {
           for (var current in this) {
               for (var other in this) {
                   if (current != other && this[current] == this[other]){
                       return true;
                   }
              }
          }
      return false;
      }
    """})

>> for data in result:
      print(data)
>> {'_id': ObjectId('5acdbf6a29561f64220f6fad'), 'apple': 8, 'spinach': 4, 'watermelon': 4}

參考資料

PyMongo 庫使用基礎(chǔ)使用速成教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猪瞬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子入篮,更是在濱河造成了極大的恐慌陈瘦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潮售,死亡現(xiàn)場離奇詭異甘晤,居然都是意外死亡,警方通過查閱死者的電腦和手機饲做,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門线婚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盆均,你說我怎么就攤上這事塞弊。” “怎么了泪姨?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵游沿,是天一觀的道長。 經(jīng)常有香客問我,道長耐量,這世上最難降的妖魔是什么嘴拢? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮眯勾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婆誓。我一直安慰自己吃环,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布洋幻。 她就那樣靜靜地躺著郁轻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上好唯,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天竭沫,我揣著相機與錄音,去河邊找鬼骑篙。 笑死输吏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的替蛉。 我是一名探鬼主播贯溅,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼躲查!你這毒婦竟也來了它浅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镣煮,失蹤者是張志新(化名)和其女友劉穎姐霍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體典唇,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡镊折,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了介衔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恨胚。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炎咖,靈堂內(nèi)的尸體忽然破棺而出赃泡,到底是詐尸還是另有隱情,我是刑警寧澤乘盼,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布升熊,位于F島的核電站,受9級特大地震影響绸栅,放射性物質(zhì)發(fā)生泄漏级野。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一粹胯、第九天 我趴在偏房一處隱蔽的房頂上張望蓖柔。 院中可真熱鬧,春花似錦矛双、人聲如沸渊抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至十减,卻和暖如春栈幸,著一層夾襖步出監(jiān)牢的瞬間愤估,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工速址, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玩焰,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓芍锚,卻偏偏與公主長得像昔园,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子并炮,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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

  • 一 基本概念 MongoDB中數(shù)據(jù)的結(jié)構(gòu)為:庫默刚、集合、文檔 1 數(shù)據(jù)庫 多個集合可以組成數(shù)據(jù)庫逃魄。MongoDb的單...
    周東波_db閱讀 2,391評論 0 4
  • 一荤西、MongoDB簡介 1.概述 ? MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫伍俘。旨在為WE...
    鄭元吉閱讀 978評論 0 2
  • 本文地址:http://www.cnblogs.com/egger/archive/2013/05/04/3059...
    彩虹之夢閱讀 549評論 0 0
  • 為什么要使用 MongoDB 以及 Pymongo 在程序開發(fā)實踐中邪锌,除了學習代碼、算法之外癌瘾,其他開發(fā)有用的程序一...
    speculatecat閱讀 3,583評論 2 13
  • 從什么時候開始喜歡上雪莉的呢觅丰?我記得好像是一個夏天,那時還在讀高中妨退。終于開始發(fā)覺女性美了舶胀!偶然在知乎刷到一張雪莉...
    尋它1988閱讀 142評論 0 1