一、
原始数据:
{
"_id" : ObjectId("56a039fd8b04f95d2a8bbc95"),
"title" : "I Have a Dream",
"comments" : [
{
"author" : "joe",
"score" : NumberInt(3),
"comment" : "nice post"
},
{
"author" : "mary",
"score" : NumberInt(6),
"comment" : "terrible post"
}
]
}
{
"_id" : ObjectId("56a03a858b04f95d2a8bbc98"),
"title" : "I Have a Dream2",
"comments" : [
{
"author" : "joe",
"score" : NumberInt(6),
"comment" : "nice post2"
},
{
"author" : "mary",
"score" : NumberInt(6),
"comment" : "terrible post2"
}
]
}
{
"_id" : ObjectId("56a03a858b04f95d2a8bbc99"),
"title" : "I Have a Dream3",
"comments" : [
{
"author" : "joe",
"score" : NumberInt(2),
"comment" : "nice post3"
},
{
"author" : "joe",
"score" : NumberInt(8),
"comment" : "terrible post3"
}
]
}
---现在要查询“由Joe发表的5分以上的评论”---
//查询结果不符,因为内嵌文档匹配要求整个文档完全匹配,而这不会匹配"comment"键。
db.blog.find({"comments":{"author":"joe","score":{"$gte":5}}})
/*
同样也不会达到目的。因为符合author条件的评论和符合score条件的评论可能不是同一条评论。也就是说,会返回刚才显示的那个文档。因为"author" : "joe"在第一条评论中匹配了,"score" : 6在第二条评论中匹配了
*/
db.blog.find({"comments.author" : "joe", "comments.score" : {"$gte" : 5}})
//正确查询
db.blog.find(
{
"comments" : {
"$elemMatch" : {
"author" : "joe",
"score":{
"$gte":5
}
}
}
}
)
mongodb匹配都是以整个document为单元获取的,例如以上例子,并不只是单单获取“由Joe发表的5分以上的评论”这个数组当中的嵌套的document
{ "comments" : { "$elemMatch" : { "author" : "joe", "score":{ "$gte":5 } } } }, { //以下这个projection,注意有“$”,表示只展示数组中匹配的document "comments.author.$": 1, "_id": 0 } result: { "comments" : [ { "author" : "joe", "score" : NumberInt(6), "comment" : "nice post2" } ] } { "comments" : [ { "author" : "joe", "score" : NumberInt(8), "comment" : "terrible post3" } ] } //不加“$”的结果 { "comments" : [ { "author" : "joe" }, { "author" : "mary" } ] } { "comments" : [ { "author" : "joe" }, { "author" : "joe" } ] }
以上内容来自 http://www.jianshu.com/p/e59cd2dc5274
db.data.insert({name:'a', num:[12,123,22,34,1]}); //指定大小为2 db.data.find({num:{$size:2}}) //$size有一个缺陷,就是无法查询某个范围的大小 db.data.find({num:{$size:{$gt:2}}}); //错误 [数组大小小于3] //这种方法具有很大的灵活性,但是速度会慢一些 db.data.find({ $where: "this.num.length < 3" }) //另外一个比较高效的方法是判断数组中的某个指定索引的元素是否存在,例如如果要求数组大小小于3 db.data.find({ "num.2": {$exists:0} })
//原始数据: { "_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 } ] } //想获取的结果: { "_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 } ] } //条件 {'favorite_shards.sid': { '$in':[NumberLong(577),NumberLong(578)] } } } //返回数组中匹配的项 db.test.aggregate({"$unwind":"$favorite_shards"}, {"$match":{"favorite_shards.sid": {"$in": [NumberLong(578), NumberLong(577)]}}}, {"$group": {"_id": "$_id", "favorite_shards":{'$push': "$favorite_shards"}}})
reference:mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组
相关推荐
MongoDB CRUD技术介绍.pptx
MongoDB CRUD技术操作概述.pptx
节点曲调 MongoDB CRUD练习。
expressjs-mongodb-crud 完整的Express.js + Node.js + MongoDB CRUD和REST骨架
java连接mongoDB,增删改查操作等等
Java mongodb入门代码,对数据的crud ,图片保存,读取,删除等
NULL 博文链接:https://kavy.iteye.com/blog/1949385
Node.js-Express-MongoDB CRUD示例应用程序 这是一个使用MongoDB的简单Node.js CRUD应用程序。 它基于 ,具有以下功能: 包括Wercker配置 应用程序更改以在Oracle Container Cloud Service上运行 怎么跑 npm ...
节点Express mongodb crud应用程序api 安装 $ git clone https://github.com/shubhamns/node-express-mongodb-crud-app.git $ cd PROJECT_TITLE $ npm install 配置应用 第1步使用localhost 1. install MongoDB `...
aspnetcore-mongodb-crud 带有MongoDB CRUD的ASP.NET Core Web API
NoSQL之MongoDB的CRUD操作 比较全面的MongoDB操作,支持面向对象. 详情http://blog.csdn.net/dengwanchuan/article/details/7514431
phpmongo-crud 一个简单的 MongoDB 和 PHP CRUD 应用程序
主要介绍了Springboot整合MongoDB进行CRUD操作的两种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
golang mgo 代码自动生成器, 生成对 mongodb 的 CRUD 操作代码
用Python内置的MongoDB CRUD 该存储库包含一个Python程序,该程序为MongoDB数据库实现基本的CRUD操作。 所有存储库均可通过Docker容器和docker-compose工具运行。项目结构该项目包含database容器, crud模块实现和该...
蒙哥-CRUD 使用NodeJS的MongoDB CRUD API
主要给大家介绍了关于MongoDB CRUD操作中的插入的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
节点mongodb-crud 这用于通过MongoDB在Node.js中进行CRUD操作。 安装 npm install node-mongodb-crud 用法 这用于通过MongoDB在Node.js中建立连接并生成CRUD操作(查找,插入,更新,删除)。 #index.js var ...
MongoDB-CRUD-Csharp C#中的MongoDB基本CRUD操作 这三个C#文件包含用于运行非常基本的UI并允许对名为“ courses”的MongoDB集合进行CRUD操作的代码。在此示例中,数据库结构保持简单,但可以扩展以允许在不同的...
Angular8 + MongoDB + CRUD 该项目是使用版本8.0.1生成的。开发服务器为开发服务器运行ng serve 。 导航到http://localhost:4200/ 。 如果您更改任何源文件,该应用程序将自动重新加载。代码脚手架运行ng generate ...