【MongoDB】一、入门

本文介绍了MongoDB的基本操作,包括查询语句如find()、逻辑运算符如$lt、$gt,以及如何查询子文档和数组中的对象。同时,展示了如何使用Python的pymongo库连接到MongoDB数据库,并执行插入、更新和删除操作。还提到了聚合框架用于数据处理和转换,以及其与SQL操作的对应关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础语句

查询语句

查询示例:

db.collection.find(),返回的是游标

db.movies.find({“year”:1975})

查询逻辑运算符

  • $lt:存在并小于

  • $lte:存在并小于等于

  • $gt:存在并大于

  • $gte:存在并大于等于

  • $ne:不存在或存在但不等于

  • $in:存在并在指定数组中

  • $nin:不存在或不在指定数组中

  • $or:匹配条件中的一个

    • db.movies.find({$or:[{“title”:“Batman”},{“category”:“action”}]})
  • $and:匹配全部条件

    • db.movies.find({$and:[{“title”:“Batman”},{“category”:“action”}]})
    • db.movies.find({“title”:“Batman”,“category”:“action”})

搜索子文档

可以使用field.sub_field查询子文档

db.fruit.insertOne({
	name: "apple",
	from: {
		country: "China",
		province: "Guangdong"
	}
})
  • 正确√:db.fruit.find({“from.country” : “China”})
    • 查询子文档from.country为china
  • 错误×:db.fruit.find({“from”:{country:“China”}})
    • 查询文档,其中有from字段,字段的值为country:“China”

搜索数组中的对象

db.fruit.insert([
	{"name": "Apple", color: ["red","green"]},
	{"name": "Mongo", color: ["yellow","green"]}
])
  • db.fruit.find({color : “red”})
    • 满足color数组有red的数据
  • db.fruit.find({$or: [{color: “red”},{color: “yellow”}]})
    • 满足color数组有red或yellow的数据
db.movies.insertOne({
	"title": "Raiders of the Lost Ark",
	"filming_locations": [
		{"city": "Los Angeles","state":"CA","country":"USA"},
		{"city": "Rome","state":"Lazio","country":"Italy"},
		{"city": "Florence","state":"SC","country":"USA"}
	]
})
  • db.movies.find({“filming_locations.city”:“Rome”})

在数组中搜索子对象的多个字段时,若使用**$elemMatch**,表示必须是同一个子对象满足多个条件

  • 错误×:能搜到结果
db.getCollection('movies').find({
	"filming_locations.city": "Rome",
	"filming_locations.country": "USA"
})
  • 正确√:不能搜到结果
db.getCollection('movies').find({
	"filming_locations":{
		$elemMatch:{"city":"Rome","country":"USA"}
	}
})

控制find返回的字段

  • _id字段必须明确指定不返回,否则默认返回
  • 在MongoDB成为投影(projection)
  • db.movies.find({“category”:“action”},{“_id”:0,“title”:1})

删除语句

db.collection.remove(<查询条件>)

  • remove需要配合查询条件使用
  • 匹配查询条件的文档会被删除
  • 指定一个空文档条件会删除所有文档

删除示例:

db.testcol.remove({a:1})【删除a=1的记录】

db.testcol.remove({a:{$lt:5}})【删除a<5的记录】

db.testcol.remove({})【删除所有记录】

db.testcol.remove()【报错】

更新语句

db.collection.update(<查询条件>,<更新字段>)

  • updateOne只更新第一条匹配的记录
  • updateMany更新所有匹配的记录
  • updateOne/updateMany方法要求更新条件必须具有以下之一,否则报错:
    • s e t / set/ set/unset
    • p u s h / push/ push/pushAll/$pop【匹配(指定/任意)的值,从数组中删除相应的对象,从数组底部删除一个对象】
    • p u l l / pull/ pull/pullAll【增加(一个/多个)对象到数组底部】
    • $addToSet【若不存在则增加一个值到数组】

db.fruit.updateOne({name: “apple”},{$set: {from: “China”}})【查询name为apple的记录,将from设为China】

删除集合和数据库

删除Collection

db.collection.drop()

  • 集合中全部文档都会被删除
  • 集合相关的索引也会被删除

删除Database

db.dropDatabase()

  • 数据库相应文件也会被删除,磁盘空间会被释放

使用python连接到MongoDB

python使用MongoDB必须安装数据库的驱动

pip install pymongo
# 检查驱动是否安装
import pymongo
pymongo.version

使用driver连接到MongoDB需指定MongoDB连接字符串,

最简单的形式:mongodb://数据库服务器主机地址:端口号

  • mongodb://127.0.0.1:27017
from pymongo import MongoClient
uri = "mongodb://127.0.0.1:27017"
client = MongoClient(uri)
# get db's handler
db=client["eshop"]
# get collection named "users"
user_coll=db["users"]
# insert a new user
new_user={"username":"Tom","password":"ttt","email":"tom@qq.com"}
result=user_coll.insert_one(new_user)
print(result)
# add an attribute for a user
result=user_coll.update_one({"username":"Nina"},{"$set":{"phone":"123456789"}})
print(result)

聚合框架(Aggregation Framework)

  • 作用在某个/些集合上
  • 对集合中的数据进行一系列运算
  • 将数据转为期望的形式

相当于SQL中的:

  • GROUP BY
  • LEFT OUTER JOIN
  • AS

基本格式

pipeline = [$stage1, $stage2, ...$stageN];
db.<COLLECTION>.aggregate(
	pipeline,
	{options}
);

例:

  • SQL查询
SELECT
FIRST_NAME AS '名'
LAST_NAME AS '姓'
FROM Users
WHERE GENDER = '男'
SKIP 100
LIMIT 20

Mongo

deb.users.aggregate([
	{$match:{gender:'男'}},
	{$skip:100},
	{$limit:20},
	{
		$project:{
			'名':'$first_name',
			'姓':'$last_name'
		}
	}
])

步骤

stage作用SQL等价运算符
$match过滤WHERE
$project投影AS
$sort排序ORDER BY
$group分组GROUP BY
s k i p / skip/ skip/limit结果限制SKIP/LIMIT
$lookup左外连接LEFT OUTHER JOIN
$unwind展开数组/
$graphLookup图搜索/
f a c e t / facet/ facet/bucket分面搜索/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值