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: < ...
随机推荐
- 常用numpy和pandas
常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准数学 ...
- Oracle或PL/SQL自动断开连接解决参考
ORACLE自动断开数据库连接解决办法 方法一.直接修改资源配置文件 分三个步骤在sqlplus环境下完成. 第一步,查询资源文件,找到CONNECT_TIME所在的pro ...
- 完全卸载win10上的Ubuntu子系统 - Windows Subsystem for Linux(WSL)
Ctrl + R 键入: lxrun /uninstall /full 具体请看 microsoft的说明:Frequently Asked Questions
- ReentrantReadWriteLock的相关使用
ReentrantLock具有完全互斥排他的效果,同一时间只有一个线程执行ReentrantLock.lock()方法后面的任务,这样虽然能够保证线程安全性,但是效率是比较低的 ReentrantRe ...
- android中的国际化
java国际化步骤: 定义资源文件: baseName_language_country.properties baseName_language.properties baseName.proper ...
- Codeforces 454E. Little Pony and Summer Sun Celebration
题意:给n个点m条边的无向图,并给出每个点的访问次数奇偶,求构造一条满足条件的路径(点和边都可以走). 解法:这道题还蛮有意思的.首先我们可以发现在一棵树上每个儿子的访问次数的奇偶是可以被它的父亲控制 ...
- 前端学习(八)sass和bootstrap(笔记)
less sass 和less基本上70%差不多(书写方式不一样) sass功能更多一点 1.定义一个变量 $b:blue; div{width:100px;height:100px; backgro ...
- 转帖 maven(一) maven到底是个啥玩意~
转载自:https://www.cnblogs.com/whgk/p/7112560.html 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清 ...
- 关于_getattr_方法的一些理解
在学习rest framework的过程中,rest framework的request是经过重构的,但是如果调用重构对象request中的属性,如果属性不存在会调用原request对象中的属性,它使 ...
- nodejs 模板引擎jade的简单使用
1.jade html head style script body div ul li li jade1.js var jade=require('jade'); var str=jade.rend ...