mongo数组修改器—$push、$ne、$addtoset、$pop、$pull
这几个方法也很有意思
$push
像已有的数组末尾加入一个元素,要是元素不存在,就会创建一个新的元素,如果元素存在了,就会再添加一个一模一样的元素,会造成元素的重复,所以在使用的时候,要确保该元素不存在
元数据
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"物理"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
db.getCollection('TestData').update({"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4")},{"$push":{"Scope":"物理"}})
结果
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"物理",
"物理"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
如果想要用$push实现不重复更新,可以和$ne结合使用,
$ne 不在
物理不在Scope数组里,才更新
db.getCollection('TestData').update({"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),"Scope":{"$ne":"物理"}},{"$push":{"Scope":"物理"}})
$addtoset
往数组里面加入数据,如果数组里已经存在,则不会加入(避免重复)
addToSet"和"addToSet"和"each”组合起来,可以添加多个不同的值
db.getCollection('TestData').update({"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4")},{"$addToSet":{"Scope":{"$each":["物理","化学"]}}})
返回:Updated 1 existing record(s) in 1ms 一毫秒更新了
**将”addToSet"和"addToSet"和"each”组合起来,可以添加多个不同的值,二用”ne"和"ne"和"push”组合就不能实现**
# 原数据
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"物理"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
} # 修改后
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"物理",
"化学"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
$pop
删除数组元素,只能从头部或尾部删除一个元素
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"物理",
"化学"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
从Scope数组中末尾开始删除
db.getCollection('TestData').update({"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4")},{"$pop":{"Scope":1}})
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"物理"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
从Scope数组中头部开始删除
db.getCollection('TestData').update({"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4")},{"$pop":{"Scope":-1}})
$pull
删除数组元素,将所有匹配的元素删除。
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"物理",
"物理",
"化学"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
想要删除物理
db.getCollection('TestData').update({"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4")},{"$pull":{"Scope":"物理"}})
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"化学"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
注意:会把符合条件的所有元素都删掉
管道中$push和$addToSet
|
$push |
在结果文档中插入值到一个数组中。 |
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
|---|---|---|
|
$addToSet |
在结果文档中插入值到一个数组中,但不创建副本。 |
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
举例:
三条数据
{
"_id" : ObjectId("5be8e73cba5ba9887ff2f8c4"),
"Level" : "本科",
"ProfessionalName" : "数学类",
"Scope" : [
"化学"
],
"ContainsProfessional" : [
"数学与应用数学",
"统计学",
"数学与应用数学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
/* 2 */
{
"_id" : ObjectId("5be8e7a9ba5ba9887ff2f8d5"),
"Level" : "本科",
"ProfessionalName" : "社会科学试验班",
"Scope" : [],
"ContainsProfessional" : [
"社会学",
"经济学(实验班)",
"国际经济与贸易(瀚德实验班)",
"金融学",
"会计学",
"人力资源管理",
"公共事业管理",
"法学(瀚德实验班)",
"法学(卓越实验班)",
"工商管理(商务实验班)"
],
"ScopeStatus" : 0,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
/* 3 */
{
"_id" : ObjectId("5be8e85dba5ba9887ff2f8ec"),
"Level" : "本科",
"ProfessionalName" : "物理学类",
"Scope" : [
"物理"
],
"ContainsProfessional" : [
"天文学",
"计算机科学与技术",
"电子信息科学与技术",
"管理科学",
"信息管理与信息系统",
"物理学(协同创新实验班)",
"物理学(基地班)",
"物理学(拔尖实验班)"
],
"ScopeStatus" : 1,
"SchoolMid" : "5b3e0926c26dec21807ec5c5"
}
$push
在结果文档中插入值到一个数组中
db.getCollection('TestData').aggregate([{"$match" :{"Level":"本科"}}, {"$project":{"Level":1, "ProfessionalName":1, "Scope":1}}, {"$group":{ "_id":"$Level", "schedule":{"$push":{"leave":"$Level","professionalName":"$ProfessionalName","scope":"$Scope"}}}}])
结果
{
"_id" : "本科",
"schedule" : [
{
"leave" : "本科",
"professionalName" : "数学类",
"scope" : [
"化学"
]
},
{
"leave" : "本科",
"professionalName" : "社会科学试验班",
"scope" : []
},
{
"leave" : "本科",
"professionalName" : "物理学类",
"scope" : [
"物理"
]
}
]
}
$addToSet
在结果文档中插入值到一个数组中,但不创建副本。
db.getCollection('TestData').aggregate([{"$match" :{"Level":"本科"}}, {"$project":{"Level":1, "ProfessionalName":1, "Scope":1}}, {"$group":{ "_id":"$Level", "schedule":{"$addToSet":{"leave":"$Level","professionalName":"$ProfessionalName","scope":"$Scope"}}}}])
结果
{
"_id" : "本科",
"schedule" : [
{
"leave" : "本科",
"professionalName" : "物理学类",
"scope" : [
"物理"
]
},
{
"leave" : "本科",
"professionalName" : "社会科学试验班",
"scope" : []
},
{
"leave" : "本科",
"professionalName" : "数学类",
"scope" : [
"化学"
]
}
]
}
肉眼观察似乎除了展示顺序有变化,其他貌似没有变化
相关文档
https://www.cnblogs.com/zzy-9318/p/10022651.html
mongo数组修改器—$push、$ne、$addtoset、$pop、$pull的更多相关文章
- mongo数据更新(修改器)
数据更新简单的做法是删除重新插入update()函数语法 db.集合.update(更新条件,新的对象数据(更新操作符),upsert,multi)upsert如果要更新的数据不存在,则增加一条新的内 ...
- C# Mongo DB 修改多层嵌套集合中的字段
C# Mongo DB 修改嵌套集合中的字段 虽然c#的mongo 驱动很强大,而且还支持linq,但是一些复杂的操作语句还是比较困难 这里我用Bson实现功能 这是模型(我这里有多层嵌套) publ ...
- mongodb的修改器
在mongodb中通常文档只会有一部分要更新,利用原子的更新修改器,可以做到只更新文档的一部分键值,而且更新极为高效,更新修改器是种特殊的键,用来指定复杂的更新操作,比如调整.增加.或者删除键,还可以 ...
- MongoDB 学习笔记(三)—— 修改器的使用
通常文档只会有一部分数据要更新,所以使用修改器来操作文档极为高效. 小技巧:了解函数功能,不带括号即可.如:db.blog.update即可查看update函数的具体参数和方法体. $set修改器 & ...
- mongodb修改器
mongodb修改器 转载自:http://blog.csdn.net/mcpang/article/details/7752736 mongodb修改器(\(inc/\)set/\(unset/\) ...
- 统计Mongo数组中相同对象的属性之和
统计Mongo数组中相同对象的属性之和 需求 需要统计app端用户的行为,按天分表,存入mongo.每次用户进行操作的时候,将数据存入app本地,下次用户启动的时候,提交存入mongo,删除app本地 ...
- MongoDB数组修改器更新数据(转)
MongoDB数组修改器更新数据 这里,我们将了解一下数组修改器.数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用.数组修改器,顾名思义,它是用 ...
- Mongodb学习笔记(2)--修改器
修改器 利用原子的更新修改器,可以使得这种部分更新极为高效,更新修改器是一种特殊的键,用来指定复杂的更新操作,比如调整,增加或删除,还可以操作数组或内嵌文档. $inc $inc修改器用来增加已有键的 ...
- mongoDB-----针对某个或多个文档只需要部分更新可使用原子的更新修改器
update() db.collection.update( <query>, <update>, { upsert: <boolean>, multi: < ...
随机推荐
- 20140922 tcpip3次握手 分段 分页 spooling 位示图
tcpip3次握手 http://www.cnblogs.com/CBDoctor/archive/2012/10/17/2727073.html 操作系统:http://blog.csdn.ne ...
- 如何安装python运行环境Anaconda
参考视频:https://v.qq.com/x/page/u05499rig9s.html
- 28-python基础-python3-列表多重赋值
1-列表多重赋值常规方法 >>> cat = ['fat', 'black', 'loud'] >>> size = cat[0] >>> col ...
- css3属性 -webkit-filter
css3属性 -webkit-filter -webkit-filter是css3的一个属性,Webkit率先支持了这几个功能,感觉效果很不错.下面咱们就学习一下filter这个属性吧. 现在规范中支 ...
- SpringCloud:基础
SpringCloud:基础 SpringCloud 是微服务架构的一个实现框架,说他是一个框架更不如说他是一个生态,他包含了很多个技术,将这些技术组合起来形成我们的微服务架构应用. 1.Spring ...
- (转)Unity Cinemachine插件,实现单目标和多目标之间切换
Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换*版本要求Unity2017.1及以上. 参考资料: [官方] Unity 2017.1正式版发布 Cinemachine插件 ...
- Vmware虚拟机中安装ubuntu18 live server+Vmware Tools(用来共享本地文件夹)
一.安装Ubuntu见链接 https://ywnz.com/linuxaz/3696.html 二.安装Vmware Tools 参考:https://blog.csdn.net/a12340123 ...
- 几种任务调度的 Java 实现方法与比较(定时任务)(转)
转自:http://blog.csdn.net/javafay/article/details/8031269 综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 ...
- java笔试手写算法面试题大全含答案
1.统计一篇英文文章单词个数.public class WordCounting {public static void main(String[] args) {try(FileReader fr ...
- svn中的trunk,branch和tags(转)
转自:https://www.cnblogs.com/keyi/p/5953649.html 我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我 ...