=Start=
缘由:
MongoDB在我的日常工作和项目中用的比较少,操作不怎么熟练,在这里简单记录学习一下MongoDB中的常见操作,方便要用的时候进行参考。
正文:
参考解答:
# 命令行操作
# 查询MongoDB中都有哪些数据库
> show dbs
# 查看当前使用的是哪个数据库
> db
# 选中并切换至某个数据库 test1
> use test1
# 查看数据库 test1 中都有哪些集合
> show collections
# 查看数据库 test1 的集合 posts 中都有哪些元素
> db.posts.find()
# 查看数据库 test1 的集合 posts 中都有哪些元素(只挑选前 2 个元素)
> db.posts.find().limit(2)
# 向数据库 test1 的集合 users 插入元素
> db.users.insert({name: 'paulo'})
> db.users.insert({name: 'pedro'})
# 模糊查询
> db.users.find({name: /a/}) //like '%a%'
> db.users.find({name: /^pa/}) //like 'pa%'
> db.users.find({name: /ro$/}) //like '%ro'
# 更新操作
> db.users.update({'name':'pedro'},{$set:{'name':'New Update pedro'}})
# 查询更新后的结果
> db.users.find()
# 删除操作
> db.users.insert({name: 'ppp'})
> db.users.remove({name: 'ppp'})
> db.users.find()
> db.users.remove()
# 报错: E QUERY [thread1] Error: remove needs a query
# 删除指定 collection 中的所有元素
> db.users.remove({})
&
# 查询collection foo 中以 _id 字段进行排序的前 50 条记录
db.foo.find().sort({_id:1}).limit(50)
# 查询collection foo 中进行「自然排序」的前 50 条记录
db.foo.find().sort({$natural:1}).limit(50)
&
// 查询 name 数组字段是否有下标为 1 的元素(如果有则说明至少有2个元素)
db.accommodations.find({'name.1': {$exists: true}})
// 使用 $where
db.accommodations.find( {$where: "this.name.length > 1"} )
// 提前创建一个额外的字段 NamesArrayLength 用于存放特定数组的大小,方便后面使用,速度更快更好
db.accommodations.find({"NamesArrayLength": {$gt: 1} })
# Python操作
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
# db = client['test_db']
db = client.test_db
# collection = db['posts']
collection = db.posts
import pprint
import datetime
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
post_id = collection.insert_one(post).inserted_id
print("post id is ", post_id)
cur_collection = db.collection_names(include_system_collections=False)
print("cur_collection is :", cur_collection)
pprint.pprint(collection.find_one())
print("Find By Post Author:")
post = collection.find_one({"author": "Mike"})
pprint.pprint(post)
print("Find By Post ID:")
post = collection.find_one({"_id": post_id})
pprint.pprint(post)
# Web应用程序中的常见任务是从请求URL获取ObjectId并找到匹配的文档。
# 在这种情况下,必须将ObjectId从一个字符串转换到符合条件的类型才行。
from bson.objectid import ObjectId
# The web framework gets post_id from the URL and passes it as a string
def get_post(post_id):
# Convert from string to ObjectId:
document = client.db.collection.find_one({'_id': ObjectId(post_id)})
# 批量插入
new_posts = [{"_id": 1000,
"author": "Curry",
"text": "Another post!",
"tags": ["bulk", "insert"],
"date": datetime.datetime(2018, 5, 12, 11, 14)},
{"_id": 1001,
"author": "Mike",
"title": "MongoDB is fun",
"text": "and pretty easy too!",
"date": datetime.datetime(2019, 5, 30, 10, 45)}
]
# collection = db.posts
result = collection.insert_many(new_posts)
print("Bulk Inserts Result is :", result.inserted_ids)
# 批量查询
# collection = db.posts
for post in collection.find():
pprint.pprint(post)
for post in collection.find({"author": "Mike"}):
pprint.pprint(post)
print("posts count is = ", collection.count())
print("posts's author is Mike count is =", collection.find({"author": "Mike"}).count())
d = datetime.datetime(2019, 5, 31, 12)
for post in collection.find({"date": {"$lt": d}}).sort("author"):
pprint.pprint(post)
参考链接:
- MongoDB的相关安全问题
https://ixyzero.com/blog/archives/1610.html - MongoDB插入文档
https://www.yiibai.com/mongodb/mongodb_insert_document.html - MongoDB查询文档
https://www.yiibai.com/mongodb/mongodb_query_document.html - when remove document from capped collection in mongoDB, it through an error?
https://stackoverflow.com/questions/39220280/when-remove-document-from-capped-collection-in-mongodb-it-through-an-error - remove needs a query at src/mongo/shell/collection.js
https://stackoverflow.com/questions/25104095/remove-needs-a-query-at-src-mongo-shell-collection-js - StackOverflow上的MongoDB常见问题汇总
https://stackoverflow.com/questions/tagged/mongodb?sort=votes&pagesize=50 - 如何在MongoDB和其它文档数据库的选型之间做选择?(When to use MongoDB or other document oriented database systems?)
https://stackoverflow.com/questions/1476295/when-to-use-mongodb-or-other-document-oriented-database-systems - MongoDB中如何获取最近的 N 条记录?
https://stackoverflow.com/questions/4421207/how-to-get-the-last-n-records-in-mongodb - MongoDB中如何进行 like 模糊查询?
https://stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like - MongoDB中如何查询数组大小超过 1 的对象?
https://stackoverflow.com/questions/7811163/query-for-documents-where-array-size-is-greater-than-1
=END=
《 “MongoDB的简单操作记录” 》 有 2 条评论
MongoDB、Cassandra 和 HBase 三种 NoSQL 数据库比较
https://mp.weixin.qq.com/s/Wqcyeq4kO8fhCobiCMwVsQ
`
MongoDB:源于开发人员,为开发人员服务
Cassandra:规模化安全运行
HBase:像Cassandra一样是个通过key-value面向列存储的服务
`
MongoDB 介绍与应用详解
https://mp.weixin.qq.com/s/KBZb8-qWML4d-oykZZ0a_w
`
五、MongoDB的先天缺陷
不支持事务(4.0之前的版本不支持事务,4.0开始支持在副本集上的事务,官方宣称会在4.2版本,支持在分片集上实现事务)
写入性能差,2.4开始的版本,默认是安全写入,确保不丢失数据,之前版本写入处理方式同redis(当然自从有了SSD,大家懂的)
磁盘、内存消耗较大
部署副本集,至少需要三个节点,其必须有个裁判节点
使用分片时,单个分片必须有副本集,否则一旦分片损坏,会引起数据丢失
国内生态不佳,熟悉者较少,大牛更少
六、什么场景下该应用用MongoDB
弱一致性场合
读取频繁的场合
数据量较大,必须分片的场合
不规则数据,且频繁更新数据类型的场合
需要可以动态追加数据字段或修改数据字段类型的场合
注意:在选择NOSQL方案时,尽可能抛弃技术栈洁癖,基于C/C++栈开发的成熟基础设施在内存管理和可靠性上有着天然优势。
`