MongoDB的简单操作记录


=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)
参考链接:

=END=


《 “MongoDB的简单操作记录” 》 有 2 条评论

  1. 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++栈开发的成熟基础设施在内存管理和可靠性上有着天然优势。
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注