MongoDB使用

news/2024/12/2 20:01:24/

文档连接: link

创建表

不需要创建表的语句,当插入表的第一条语句时,会隐式的创建表。

插入一条

db.people.insertOne({ user_id: "bcd001", age: 45, status: "A" }
)

插入多条

db.collection.insertMany([ <document 1> , <document 2>, ... ],{writeConcern: <document>,ordered: <boolean>}
)

writeConcern

如果mongodb有多个节点,这个writeConcern是说到底写几个节点再返回。写一个节点性能快,写多个节点性能慢。

test> db.people.insertOne(
...    { user_id: "bcd001", age: 45, status: "A" },
...    {
...    "writeConcern":{w:"majority",j:true,wtimeout:5000}
...     }
... )
{acknowledged: true,insertedId: ObjectId("649be01774d3e265a2c00f74")
}
参数说明
w:"majority”写的时候写大多数节点就返回
j:true表示刷到磁盘之后在返回(日志为false,计算结果为true)
wtimeout:5000快速失败(熔断)
ordered:true多条情况下是否按顺序插入

js脚本批量新增

客户端就是一个js的控制台。

# 通过使用客户端的load()命令批量新增
# /mongodb/js/books.js是下面脚本的路径
test> load("/mongodb/js/books.js");
true
test> db.books.countDocuments();
500000
var tags = ["nosql","mongodb","document","developer","popular"];
var types = ["technology","sociality","travel","novel","literature"];
var books=[];
for(var i=0;i<500000;i++){
var typeIdx = Math.floor(Math.random()*types.length);
var tagIdx = Math.floor(Math.random()*tags.length);
var favCount = Math.floor(Math.random()*100);
var book = {
title: "book-"+i,
type: types[typeIdx],
tag: tags[tagIdx],
favCount: favCount,
author: "xxx"+i
};
books.push(book)
}
db.books.insertMany(books);

help

db.help()
db.books.help()

db.books.find()
db.books.find({tag:"nosql"})

条件查询

SQLMQL
a = 1{a: 1}
a <> 1{a: {$ne: 1}}
a > 1{a: {$gt: 1}}
a >= 1{a: {$gte: 1}}
a < 1{a: {$lt: 1}}
a <= 1{a: {$lte: 1}}

查询逻辑

SQLMQL
a = 1 AND b = 1{a: 1, b: 1}或{$and: [{a: 1}, {b: 1}]}
a = 1 OR b = 1{$or: [{a: 1}, {b: 1}]}
a IS NULL{a: {$exists: false}}
a IN (1, 2, 3){a: {$in: [1, 2, 3]}}

正则表达式

## 使用正则表达式查找type包含 so 字符串的book
db.books.find({type:{$regex:"so"}})
## 或者
db.books.find({type:/so/})

排序

# #指定按收藏数(favCount)降序返回
db.books.find({type:"travel"}).sort({favCount:-1})

分页

db.books.find().skip(16).limit(8)

数据量非常大的情况下,避免使用分页,因为还是会扫描前多少条。

test> db.books.find({_id:{$gt: ObjectId("649be1ac74d3e265a2c00ff8")}}).limit(1)
[{_id: ObjectId("649be1ac74d3e265a2c00ff9"),title: 'book-132',type: 'literature',tag: 'popular',favCount: 97,author: 'xxx132'}
]

聚合函数

count

避免这种查询,这种也会扫描全部

# 为了计算总页数而进行的 count() 往往是拖慢页面整体加载速度的原因
db.coll.count({x: 100});

db.collection.updateOne()
db.collection.updateMany()
db.collection.updateOne(
<filter>,
<update>,{upsert: <boolean>,writeConcern: <document>,collation: <document>,arrayFilters: [ <filterdocument1>, ... ],hint: <document|string> // Available starting in MongoDB 4.2.1}
)

参数说明

参数
filter一个筛选器对象,用于指定要更新的文档。只有与筛选器对象匹配的第一个文档才会被更新。
update一个更新操作对象,用于指定如何更新文档。可以使用一些操作符,例如 s e t 、 set、 setinc、$unset等,
以更新文档中的特定字段
upsert一个布尔值,用于指定如果找不到与筛选器匹配的文档时是否应插入一个新文档。如果upsert为true,
则会插入一个新文档。默认值为false。
writeConcern一个文档,用于指定写入操作的安全级别。可以指定写入操作需要到达的节点数或等待写入操作的时间。
collation一个文档,用于指定用于查询的排序规则。例如,可以通过指定locale属性来指定语言环境,从而实现基于区域设置的排序
arrayFilters一个数组,用于指定要更新的数组元素。数组元素是通过使用更新操作符 [ ] 和 []和 []来指定的。
hint一个文档或字符串,用于指定查询使用的索引。该参数仅在MongoDB 4.2.1及以上版本中可用。

update的操作符

操作符格式描述
$set{$set:{field:value}}指定一个键并更新值,若键不存
在则创建
$unset{$unset : {field : 1 }}删除一个键
$inc{$inc : {field : value } }对数值类型进行增减
$rename{$rename : {old_field_name :new_field_name } }修改字段名称
$push{ $push : {field : value } }将数值追加到数组中,若数组不存在则会进行初始化
$pushAll{$pushAll : {field : value_array}}追加多个值到一个数组字段内
$pull{$pull : {field : _value } }从数组中删除指定的元素
$addToSet{$addToSet : {field : value } }添加元素到数组中,具有排重功能
$pop{$pop : {field : 1 }}删除数组的第一个或最后一个元素
 test> db.books.find({_id:{$gt: ObjectId("649be1ac74d3e265a2c00ff8")}}).limit(1)
[{_id: ObjectId("649be1ac74d3e265a2c00ff9"),title: 'book-132',type: 'literature',tag: 'popular',favCount: 98,author: 'xxx132'}
]
test> db.books.updateOne(
... {title:"my book"},
... {$set:{tags:["nosql","mongodb"],type:"none",author:"fox"}},
... {upsert:true}
... )
{acknowledged: true,insertedId: ObjectId("649bf00ce9b03ae08c3a971e"),matchedCount: 0,modifiedCount: 0,upsertedCount: 1
}

更新多个

# 插入的时间统一以零时区为准,存在多个地区多个节点的情况下,如果以各自时区为准,会乱套。
db.books.updateMany({type:"novel"},{$set:{publishedDate:new Date()}})

findAndModify

先查,再返回。类似并发的getAndIncreament();返回旧值

 # 将某个book文档的收藏数(favCount)加1
db.books.findAndModify({query:{_id:ObjectId("642ec31813bdda928a1ea2a8")},update:{$inc:{favCount:1}}
})

默认情况下,findAndModify会返回修改前的“旧”数据。如果希望返回修改后的数据,则可以指定
new选项

db.books.findAndModify({query:{_id:ObjectId("642ec31813bdda928a1ea2a8")},update:{$inc:{favCount:1}},new:true
})

# 删除一个
db.books.deleteOne ({ type:"novel" })
# 删除集合下全部文档 ,不如直接drop性能快
db.books.deleteMany ({})
# 删除 type等于 novel 的全部文档
db.books.deleteMany ({ type:"novel" }) 

findOneAndDelete

可以实现队列,某些场景下可以实现一个队列。

db.books.findOneAndDelete({type:"novel"})

批量操作

db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )db.pizzas.bulkWrite( [
{ insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } },
{ insertOne: { document: { _id: 4, type: "sausage", size: "large", price: 10 } }
},
{ updateOne: {
filter: { type: "cheese" },
update: { $set: { price: 8 } }
} },
{ deleteOne: { filter: { type: "pepperoni"} } },
{ replaceOne: {
filter: { type: "vegan" },
replacement: { type: "tofu", size: "small", price: 4 }
} }
] )

http://www.ppmy.cn/news/638997.html

相关文章

02_C语言_\x

\ 具有转义的作用 \x表示后面两位用十六进制来表示 所以’\x0A’表示ASCII码为10的字符

《统计学习方法》——朴素贝叶斯参数的极大似然估计

参考资料&#xff1a; 《统计学习方法》李航https://www.zhihu.com/question/33959624 Step1. 似然函数 在朴素贝叶斯模型中&#xff0c;我们需要通过训练集确定的参数为 θ k P ( y c k ) \theta_kP(yc_k) θk​P(yck​) 和 μ j l k P ( x ( j ) a j l ∣ y c k ) …

android开发,魅蓝note2无法连接到os x 的解决办法

新弄了个魅蓝note2 ,开发的时候发现连接不上Mac电脑&#xff0c;在网上找了半天终于找到了&#xff0c;特此分享一下 1、打开USB调试&#xff08;废话&#xff09; 2、连上电脑&#xff0c;选择连接方式为媒体设备或相机&#xff08;仅充电是无效的&#xff09;&#xff0c;提…

魅族flashfire_[FIRE]魅族魅蓝Note2公开版 解锁BL 刷入奇兔中文recovery教程

马上注册,玩转你的爱机。 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 残芯此生不换 于 2019-9-4 11:00 编辑 魅族魅蓝Note2公开版 解锁BL 刷入奇兔中文recovery教程,刷机必备 若手机已经解锁ROOT过,刷入了TWRP第三方recovery,可直接使用奇兔一键刷机! …

魅族魅蓝X幻影蓝/曜石黑版本1月23日首发上市

魅族科技(MEIZU)宣布魅蓝 X 幻影蓝、曜石黑版本将于 1 月 23 日 10&#xff1a;00 正式首发上市&#xff0c;3GB 运行内存32GB 存储版本售1699 元&#xff0c;4GB运行内存64GB 存储版本售 1999 元。用户可在魅族商城、京东商城、魅族天猫官方旗舰店、魅族专卖店进行购买。 魅蓝…

魅蓝X获取root权限

# adb shell am start -a android.intent.action.MAIN -n com.android.settings/com.meizu.settings.root.RootRequestActivity --ei uid 2000 --ei pid 4801 > /dev/null

最美手机 魅族魅蓝X幻影蓝/曜石黑上市

魅蓝X是目前魅族最“漂亮”魅族手机&#xff0c;自从发布以来就不断有用户呼唤幻影蓝/曜石黑尽快上市。然而由于这两种颜色上色工艺的复杂性&#xff0c;在产品发布一个多月后&#xff0c;这两个稀有颜色终于限量开售。 在外观上&#xff0c;魅蓝X正面搭载5.5 英寸屏幕。其最大…

魅蓝x android,魅蓝X怎么样?魅蓝X好用吗?

魅蓝X怎么样 魅蓝X采用5.5英寸夏普屏(全球量产最薄的Full InCell面板&#xff0c;支持TDDI像素隔离技术)&#xff0c;拥有1500:1对比度&#xff0c;峰值亮度达到 500cd/㎡&#xff0c;在光线强烈的户外环境下屏幕上的内容依然清晰可见&#xff0c;full in cell全贴合技术的加入…