热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mongodb内嵌数组查询问题:如何限定返回与条件匹配的数组

往数据库表“users”中插入测试数据db.users.insertMany([{_id:NumberLong(1181675746),shard_qty:4,good

//往数据库表“users”中插入测试数据> db.users.insertMany([{"_id" : NumberLong(1181675746),"shard_qty" : 4,"goods_qty" : 0,"shop_qty" : 0,"favorite_qty" : 4,"favorite_shards" : [ {"sid" : NumberLong(580),"favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),"is_attention" : true}, {"sid" : NumberLong(579),"favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),"is_attention" : true}, {"sid" : NumberLong(578),"favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),"is_attention" : true}, {"sid" : NumberLong(577),"favorite_dt" : ISODate("2015-06-26T13:20:48.449+08:00"),"is_attention" : true}]}]
)

//一:假设查询条件为:

> db.getCollection('users').findOne({'_id':NumberLong(1181675746),'favorite_shards.sid': {'$in':[NumberLong(577),NumberLong(578)]}},{"favorite_shards":1}
)

//想要返回的数据:

{"_id" : NumberLong(1181675746),"favorite_shards" : [ {"sid" : NumberLong(578),"favorite_dt" : ISODate("2015-06-26T12:13:06.405+08:00"),"is_attention" : true}, {"sid" : NumberLong(577),"favorite_dt" : ISODate("2015-06-26T13:20:48.449+08:00"),"is_attention" : true}]
}

//实际返回的数据:

{"_id" : NumberLong(1181675746),"favorite_shards" : [{"sid" : NumberLong(580),"favorite_dt" : ISODate("2015-06-26T04:13:06.405Z"),"is_attention" : true},{"sid" : NumberLong(579),"favorite_dt" : ISODate("2015-06-26T04:13:06.405Z"),"is_attention" : true},{"sid" : NumberLong(578),"favorite_dt" : ISODate("2015-06-26T04:13:06.405Z"),"is_attention" : true},{"sid" : NumberLong(577),"favorite_dt" : ISODate("2015-06-26T05:20:48.449Z"),"is_attention" : true}]
}

//二:正确的查询条件:实现的逻辑就是将原来的数组拆开,然后重组就好了。

> db.getCollection('users').aggregate([{"$match":{"_id":NumberLong(1181675746)}},{"$project":{"_id":1,"favorite_shards":1}},{"$unwind": "$favorite_shards"},{$match: {"favorite_shards.sid": {'$in':[NumberLong(577),NumberLong(578)]}}},{"$group": {"_id": "$_id", "favorite_shards": {"$push": "$favorite_shards"}}}]).pretty()

{"_id" : NumberLong(1181675746),
"favorite_shards" : [{"sid" : NumberLong(578),"favorite_dt" : ISODate("2015-06-26T04:13:06.405Z"),"is_attention" : true},{"sid" : NumberLong(577),"favorite_dt" : ISODate("2015-06-26T05:20:48.449Z"),"is_attention" : true}
]
}

 


推荐阅读
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • 本文讨论了一个关于正则的困惑,即为什么一个函数会获取parent下所有的节点。同时提出了问题是否是正则表达式写错了。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
会唱歌的高跟鞋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有