这几个方法也很有意思

$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. Jmeter+ InfluxDB+Grafana安装配置

    前置条件: 系统:windows jmeter:5.1 InfluxDB安装 下载InfluxDB-v1.7.9和Chronograf-v1.7.14(InfluxDB的可视化web端). 下载完成之 ...

  2. 热修复设计之CLASS_ISPREVERIFIED(二)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从CLASS_ISPREVERIFIED实战来介绍热 ...

  3. Python最快的方式来读取大文本文件(几GB)

    我有一个大文本文件(约7 GB).我正在寻找是否存在阅读大文本文件的最快方法.我一直在阅读有关使用多种方法作为读取chunk-by-chunk以加快进程的过程. 例如,effbot建议 # File: ...

  4. 挂载时出现mount: RPC: Unable to receive; errno = Connection refused错误的解决方法

    当我们在做NFS开发板下挂载时,经常会出现mount: RPC: Unable to receive; errno = Connection refused的错误,连接被拒绝了,到底是什么原因呢? 这 ...

  5. OC开发系列-内存管理

    概述 移动设备的内存极其有限,每个app所有占用的内存是有限的.当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. 任何集成了NSObject的对象都需要手动进行 ...

  6. Android多线程:深入分析 Handler机制源码(二)

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 接下来,深入分析 Handler机制的源码,希望加深理解 目录 1. Handler 机制简介 定义一套 Android 消息 ...

  7. 【记录】Nginx错误could not build the server_names_hash you should increase server_names_hash_bucket_size: 32

    今天遇到这个错误,现记录下解决方案: 在nginx的配置文件的http段中增加如下配置: server_names_hash_bucket_size 64; 下面是nginx官方文档解释: 如果定义了 ...

  8. C3P0连接池属性配置注释

    属性 解释 acquireIncrement 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 默认为:3 acquireRetryAttempts 定义在从数据库获取新连接失败后重复尝试的次数 ...

  9. webpack devServer配置项的坑

    本文所用webpack版本为4+,阅读本章的同学请注意区分. webpack默认不需要配置文件 但是你仍可在项目的node_module目录同级目录建立一个webpack.config.js文件进行配 ...

  10. 管理员技术(三): 配置静态网络地址、 使用yum软件源 、 升级Linux内核、查找并处理文件、查找并提取文件内容

    一. 配置静态网络地址 目标: 本例要求为虚拟机 server 配置以下静态地址参数: 1> 主机名:server0.example.com    2> IP地址:172.25.0.11  ...