这几个方法也很有意思

$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的更多相关文章

  1. mongo数据更新(修改器)

    数据更新简单的做法是删除重新插入update()函数语法 db.集合.update(更新条件,新的对象数据(更新操作符),upsert,multi)upsert如果要更新的数据不存在,则增加一条新的内 ...

  2. C# Mongo DB 修改多层嵌套集合中的字段

    C# Mongo DB 修改嵌套集合中的字段 虽然c#的mongo 驱动很强大,而且还支持linq,但是一些复杂的操作语句还是比较困难 这里我用Bson实现功能 这是模型(我这里有多层嵌套) publ ...

  3. mongodb的修改器

    在mongodb中通常文档只会有一部分要更新,利用原子的更新修改器,可以做到只更新文档的一部分键值,而且更新极为高效,更新修改器是种特殊的键,用来指定复杂的更新操作,比如调整.增加.或者删除键,还可以 ...

  4. MongoDB 学习笔记(三)—— 修改器的使用

    通常文档只会有一部分数据要更新,所以使用修改器来操作文档极为高效. 小技巧:了解函数功能,不带括号即可.如:db.blog.update即可查看update函数的具体参数和方法体. $set修改器 & ...

  5. mongodb修改器

    mongodb修改器 转载自:http://blog.csdn.net/mcpang/article/details/7752736 mongodb修改器(\(inc/\)set/\(unset/\) ...

  6. 统计Mongo数组中相同对象的属性之和

    统计Mongo数组中相同对象的属性之和 需求 需要统计app端用户的行为,按天分表,存入mongo.每次用户进行操作的时候,将数据存入app本地,下次用户启动的时候,提交存入mongo,删除app本地 ...

  7. MongoDB数组修改器更新数据(转)

    MongoDB数组修改器更新数据    这里,我们将了解一下数组修改器.数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用.数组修改器,顾名思义,它是用 ...

  8. Mongodb学习笔记(2)--修改器

    修改器 利用原子的更新修改器,可以使得这种部分更新极为高效,更新修改器是一种特殊的键,用来指定复杂的更新操作,比如调整,增加或删除,还可以操作数组或内嵌文档. $inc $inc修改器用来增加已有键的 ...

  9. mongoDB-----针对某个或多个文档只需要部分更新可使用原子的更新修改器

    update() db.collection.update( <query>, <update>, { upsert: <boolean>, multi: < ...

随机推荐

  1. 20140922 tcpip3次握手 分段 分页 spooling 位示图

    tcpip3次握手 http://www.cnblogs.com/CBDoctor/archive/2012/10/17/2727073.html   操作系统:http://blog.csdn.ne ...

  2. 如何安装python运行环境Anaconda

    参考视频:https://v.qq.com/x/page/u05499rig9s.html

  3. 28-python基础-python3-列表多重赋值

    1-列表多重赋值常规方法 >>> cat = ['fat', 'black', 'loud'] >>> size = cat[0] >>> col ...

  4. css3属性 -webkit-filter

    css3属性 -webkit-filter -webkit-filter是css3的一个属性,Webkit率先支持了这几个功能,感觉效果很不错.下面咱们就学习一下filter这个属性吧. 现在规范中支 ...

  5. SpringCloud:基础

    SpringCloud:基础 SpringCloud 是微服务架构的一个实现框架,说他是一个框架更不如说他是一个生态,他包含了很多个技术,将这些技术组合起来形成我们的微服务架构应用. 1.Spring ...

  6. (转)Unity Cinemachine插件,实现单目标和多目标之间切换

    Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换*版本要求Unity2017.1及以上. 参考资料: [官方] Unity 2017.1正式版发布 Cinemachine插件 ...

  7. Vmware虚拟机中安装ubuntu18 live server+Vmware Tools(用来共享本地文件夹)

    一.安装Ubuntu见链接 https://ywnz.com/linuxaz/3696.html 二.安装Vmware Tools 参考:https://blog.csdn.net/a12340123 ...

  8. 几种任务调度的 Java 实现方法与比较(定时任务)(转)

    转自:http://blog.csdn.net/javafay/article/details/8031269 综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 ...

  9. java笔试手写算法面试题大全含答案

    1.统计一篇英文文章单词个数.public class WordCounting {public static void main(String[] args) {try(FileReader fr ...

  10. svn中的trunk,branch和tags(转)

    转自:https://www.cnblogs.com/keyi/p/5953649.html  我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我 ...