前言
今天开始接触非关系型数据库的mongoDB,现在将自己做的笔记发出来,供大家参考,也便于自己以后忘记了可以查看。
首先,mongoDB,是一种数据库,但是又区别与mysql,sqlserver、orcle等关系数据库,在优势上面也略高一筹;至于为什么会这么说呢?很简单,我们来举两个例子:
1.在存储上面,非关系型数据库可以更大规模的存储,打个比方,Facebook用的数据库就是非关系型数据库。
2.运用起来更加流畅也是这个数据库的优点,将分布式的特点发挥到极致。
当我查看官方文档的时候,简直要人命,光是一个插入方法都讲了好几条,脑袋都大了,现在我总结一下每一插入方法的特性
db.collection.insert()
db.collection.insert() 向集合插入一个或多个文档.要想插入一个文档,传递一个文档给该方法;要想插入多个文档,就可以采用该方法。
例如
db.users.insert(
[
{ name: "bob", age: 42, status: "A", },
{ name: "ahn", age: 22, status: "A", },
{ name: "xi", age: 34, status: "D", }
]
)
如果插入成功就会返回
WriteResult({ "nInserted" : 3 })
如果异常情况,那么就会返回如下咯:
WriteResult({
"nInserted" : 3,
"writeConcernError" : {
"code" : 64,
"errmsg" : "waiting for replication timed out at shard-a"
}
})
当我们想插入一条数据的时候,采用insert的方法据比较浪费内存,这个时候,我们久采用插入单个的语法db.collection.insertOne() 向集合插入 单个 文档 document 举个小列子来说明一下。
db.users.insertOne(
{
name: "sue",
age: 19,
status: "P"
}
)
有了单个,就肯定会有多个,那么多个又是怎么样的呢?语法都很类似,db.collection.insertMany()这个语法跟上面没有区别嘛,对不对,当然是错的,你想,如果添加的数据是数组里面嵌套数组,前面两个的方法的性能就大打折扣了,影响数据库的性能。废话少说,列子走一波:
db.users.insertMany(
[
{
_id: 1,
name: "sue",
age: 19,
type: 1,
status: "P",
favorites: { artist: "Picasso", food: "pizza" },
finished: [ 17, 3 ],
badges: [ "blue", "black" ],
points: [
{ points: 85, bonus: 20 },
{ points: 85, bonus: 10 }
]
},
{
_id: 2,
name: "bob",
age: 42,
type: 1,
status: "A",
favorites: { artist: "Miro", food: "meringue" },
finished: [ 11, 25 ],
badges: [ "green" ],
points: [
{ points: 85, bonus: 20 },
{ points: 64, bonus: 12 }
]
},
{
_id: 3,
name: "ahn",
age: 22,
type: 2,
status: "A",
favorites: { artist: "Cassatt", food: "cake" },
finished: [ 6 ],
badges: [ "blue", "Picasso" ],
points: [
{ points: 81, bonus: 8 },
{ points: 55, bonus: 20 }
]
},
{
_id: 4,
name: "xi",
age: 34,
type: 2,
status: "D",
favorites: { artist: "Chagall", food: "chocolate" },
finished: [ 5, 11 ],
badges: [ "Picasso", "black" ],
points: [
{ points: 53, bonus: 15 },
{ points: 51, bonus: 15 }
]
},
{
_id: 5,
name: "xyz",
age: 23,
type: 2,
status: "D",
favorites: { artist: "Noguchi", food: "nougat" },
finished: [ 14, 6 ],
badges: [ "orange" ],
points: [
{ points: 71, bonus: 20 }
]
},
{
_id: 6,
name: "abc",
age: 43,
type: 1,
status: "A",
favorites: { food: "pizza", artist: "Picasso" },
finished: [ 18, 12 ],
badges: [ "black", "blue" ],
points: [
{ points: 78, bonus: 8 },
{ points: 57, bonus: 7 }
]
}
]
)
注意:insertOne()、insertMany()是3.2版本的语法。
既然增了,就得查找,对吧,查找里面呢也有很多小东西,有许多自己自定义查询。
1、查询全部
db.users.find( {} ) 等价于db.users.find()
2、指定等于条件
一个 query filter document 可以使用 <field>:<value> 表达式指定等于条件以选择所有包含 <field> 字段并且等于特定 <value> 的所有文档:
下面的示例从 user 集合中检索 status 字段值为 “P” 或者 “D” 的所有文档:
db.users.find( { status: { $in: [ "P", "D" ] } } )
3、指定 AND 条件
复合查询可以在集合文档的多个字段上指定条件。隐含地,一个逻辑的 AND 连接词会连接复合查询的子句,使得查询选出集合中匹配所有条件的文档。
下面的示例在 users 集合中检索 status 等于 "A"``**并且** ``age 小于 ($lt) 30是所有文档:
db.users.find( { status: "A", age: { $lt: 30 } } )
4、指定 OR 条件
通过使用 $or 操作符,你可以指定一个使用逻辑 OR 连接词连接各子句的复合查询选择集合中匹配至少一个条件的文档。
下面的示例在 users 集合中检索 status` 等于 "A"**或者**age 小于 ($lt) 30 所有文档:
db.users.find(
{
$or: [ { status: "A" }, { age: { $lt: 30 } } ]
}
)
5、指定 AND 和 OR 条件(可以更加精确的查询)
在下面的示例中,复合查询文档选择集合中status`` 等于 "A" 并且 要么 age 小于 ($lt) 30 要么 type 等于 1 的所有文档:
db.users.find(
{
status: "A",
$or: [ { age: { $lt: 30 } }, { type: 1 } ]
}
)
6、嵌入文档上的精确匹配
使用{ <field>: <value> }并且 “” 为要匹配文档的查询文档,来指定匹配整个内嵌文档的完全相等条件.(要使)相等条件匹配上内嵌文档需要指定 包括字段顺序的 精确 匹配。
在下面的例子中,查询匹配所有 favorites 字段是以该种顺序只包含 等于 "Picasso"``的 ``artist 和等于 "pizza" 的 food 字段的内嵌文档:
db.users.find( { favorites: { artist: "Picasso", food: "pizza" } } )
7、嵌入文档中字段上的等于匹配
在下面的例子中,查询使用 dot notation 匹配所有 favorites 字段是包含等于 "Picasso" 的字段 ``artist``(可能还包含其他字段) 的内嵌文档:
db.users.find( { "favorites.artist": "Picasso" } )
8、数组上的查询
采用一个参数: $elemMatch (该参数是值精确的数组)
下面的例子查询 finished 数组至少包含一个大于 ($gt) 15 并且小于 ($lt) 20 的元素的文档:
db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )
9、嵌入文档数组
使用数组索引匹配嵌入文档中的字段
在下面的例子中,查询使用 the dot notation 匹配所有 dadges 是第一个元素为”black” 的数组的文档:
db.users.find( { 'points.0.points': { $lte: 55 } } )
10、不指定数组索引匹配字段
如果你不知道文档在数组中的索引位置,用点号 (.) 将包含数组的字段的名字和内嵌文档的字段的名字连起来。
下面的例子选择出所有 points``数组中至少有一个嵌入文档包含值小于或等于 ``55 的字段 points 的文档:
db.users.find( { 'points.points': { $lte: 55 } } )
11、指定数组文档的多个查询条件
单个元素满足查询条件
使用 $elemMatch 操作符为数组元素指定复合条件,以查询数组中至少一个元素满足所有指定条件的文档。
下面的例子查询 points 数组有至少一个包含 points 小于等于 70 并且字段 bonus 等于 20 的内嵌文档的文档:
db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } }
12、元素组合满足查询条件
下面的例子查询了 points 数组包含了以某种组合满足查询条件的元素的文档;例如,一个元素满足 points 小于等于 70 的条件并且有另一个元素满足 bonus 等于 20 的条件,或者一个元素同时满足两个条件:
db.users.find( { "points.points": { $lte: 70 }, "points.bonus": 20 } )
接下来就是更新咯,老样子跟插入方法差不多,更新就可以看做是插入的一种。
来一段官方文档的话:
如果 db.collection.update() ,db.collection.updateOne() , db.collection.updateMany() 或者 db.collection.replaceOne() 包含 upsert : true 并且 没有文档匹配指定的过滤器,那么此操作会创建一个新文档并插入它。如果有匹配的文档,那么此操作修改或替换匹配的单个或多个文档。
这个解释在我认为就是在没有该数据的时候就会创建相应的数据,毕竟它是插入的一种特殊方法。
1、db.collection.updateOne():修改单条数据
下面的例子对 users 集合使用 db.collection.updateOne() 方法来更新第一个 根据 过滤条件favorites.artist 等于 “Picasso” 匹配到的文档更新操作:
使用 $set 操作符更新 favorites.food 字段的值为 “pie” 并更新 type 字段的值为 3,
db.users.updateOne(
{ "favorites.artist": "Picasso" },
{
$set: { "favorites.food": "pie", type: 3 },
}
)
2、db.collection.update()的用法和db.collection.updateOne()类似,为了区别一下,我们采用了 { multi: true }这个参数,这样会在你修改之后的数据中有这个参数,表示修改完成。
db.users.update(
{ "favorites.artist": "Pisanello" },
{
$set: { "favorites.food": "pizza", type: 0, }
},
{ multi: true }
)
3、 db.collection.updateMany(),这个会不会认为是修改很多,当然可以这么理解,但是我更喜欢把他理解成修改多个参数。
下面这个举例就是为了大家看的明白采用了{ upsert: true },它可以清晰的返回你修改后的值
db.inspectors.updateMany(
{ "Sector" : { $gt : 4 }, "inspector" : "R. Coltrane" },
{ $set: { "Patrolling" : false } },
{ upsert: true }
);
4、修改还有一个就是文档替换db.collection.replaceOne
下面的例子对 users 集合使用 db.collection.replaceOne() 方法将通过过滤条件 name 等于 "sue" 匹配到的 **第一个** 文档替换为新文档:
db.users.replaceOne(
{ name: "abc" },
{ name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } }
)
走着,撸删除了:
1、删除所有文档db.collection.remove()
这个方法就干脆了,就相当于sql中的删除表结构的delete()
db.users.remove({})
作为另一种选择如下例子使用 db.collection.remove() 从 users 集合中删除所有 status 字段等于 “A” 的文档:
db.users.remove( { status : "P" } )
2、仅删除一个满足条件的文档db.collection.deleteOne()
如下例子使用 db.collection.deleteOne() 删除 第一个 status 字段等于 “A” 的文档:
db.users.deleteOne( { status: "D" } )
3、删除集合中所有文档db.collection.deleteMany()
如下的例子使用 db.collection.deleteMany() 方法从 users 集合中删除了 所有 文档:
db.users.deleteMany({})
以上是通过两天学习官方文达能的总结,下面配上官方文档的地址表示感谢。
https://docs.mongodb.com/manual/reference/method/js-collection/
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
mongodb,crud
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]