这几个方法也很有意思

$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

最新文章

  1. sql 取首次投资的人
  2. Fix Internet Explorer Crashes with SharePoint 2013 Online Presence Indicators
  3. js匿名函數
  4. 自动发牌(C#版)
  5. mysql基础知识(4)--修改
  6. 【剑指offer】包括min函数的栈
  7. html-----015---HTML ASCII 参考手册
  8. php 站内搜索 多表 分页
  9. JFreeChart多坐标轴曲线图
  10. 查看Samba用户的方法
  11. 201521123029《Java程序设计》第十周学习总结
  12. Web自动化框架LazyUI使用手册(8)--excel数据驱动详解(ExcelDataProvider)
  13. Exp4 恶意代码分析 20164313 杜桂鑫
  14. Java基础笔记(2) 程序入口 关键字 标识符 常量 变量
  15. BZOJ4184:shallot(线段树分治,线性基)
  16. Netty源码分析第7章(编码器和写数据)---->第2节: MessageToByteEncoder
  17. Struts2页面开发中常用标签使用说明
  18. C#高级编程五十七天----位数组
  19. 原生JS表单序列化
  20. iOS-UICollectionView快速构造/拖拽重排/轮播实现

热门文章

  1. Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR invalid longitude,latitude pair 111.110000,111.230000
  2. 破解Pycharm 2019.2
  3. 使用python+ffmpeg批量转换格式
  4. svn - Subversion 命令行客户端工具
  5. 游戏game
  6. koa 中间件 koa-art-template 的使用
  7. 简单记录下Jmeter通过CSV保存测试数据,测试用例,及将测试结果导出到Excel里
  8. Java中的LinkedHashSet
  9. Windows cmd 打开面板
  10. 深入理解MAGENTO – 第八章 – 深入MAGENTO的系统配置