`

mongodb crud注意点

 
阅读更多

一、

原始数据: 
{ 
    "_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 内嵌数组查询问题: 如何限定返回与条件匹配的数组

分享到:
评论

相关推荐

    java操作mongoDB(CRUD)

    Java操作MongoDB主要涉及到的是Java驱动程序与MongoDB数据库之间的交互,这涵盖了创建连接、执行CRUD(创建、读取、更新、删除)操作等一系列基本的数据库管理任务。MongoDB是一个流行的NoSQL数据库,以其灵活性、高...

    Java操作MongoDB之CRUD(增删改查)

    这篇博文“Java操作MongoDB之CRUD(增删改查)”主要探讨了如何使用Java驱动程序来执行基本的数据库操作,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete)。 首先,我们来了解MongoDB的Java驱动...

    MongoDB CRUD技术操作概述.pptx

    以下是 MongoDB CRUD 技术操作概述的知识点: 写入(Create) * `insert` 方法:用于将文档插入到集合中。 * 不显式指定 `_id`:如果不指定 `_id`,MongoDB 会自动生成一个 ObjectId。 * 显式指定 `_id`:可以手动...

    Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)

    Springboot整合MongoDB进行CRUD操作的两种方式 在分布式和微服务架构中,Springboot和MongoDB是非常流行的技术栈。 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库。两者在实际应用中使用...

    Java mongodb CRUD 操作代码

    在本文中,我们将深入探讨如何使用Java进行MongoDB的基本CRUD操作,以及如何处理图片的存储、读取和删除。MongoDB是一个流行的NoSQL数据库,它以JSON格式存储数据,而Java是与其交互的常用编程语言。让我们开始探索...

    MongoDB CRUD技术介绍.pptx

    对比之下,MongoDB的灵活性意味着开发者可以更自由地构建数据模型,但也需注意代码的容错性,以防止因过于灵活的数据结构导致的问题。 MongoDB的CRUD操作如下: 1. **创建(Create)**: - 使用`db.collection....

    基于Java语言及类似mybatisPlus Lambda的MongoDB CRUD操作简化设计源码

    本项目是一款基于Java语言的MongoDB操作库,采用类似MybatisPlus Lambda的简化设计,旨在简化MongoDB的CRUD操作。项目包含160个文件,主要包含152个Java源文件,2个XML配置文件,以及1个LICENSE文件。该库支持逻辑...

    expressjs-mongodb-crud:完整的Express.js + Node.js + MongoDB CRUD和REST骨架

    **Express.js + Node.js + MongoDB CRUD和REST骨架详解** 在Web开发中,Express.js是Node.js平台上最流行的框架,用于构建高效、可扩展的网络应用。MongoDB则是一种非关系型数据库,以其灵活性和高性能而受到青睐。...

    nodejs-mongodb-crud:Node.js-Express-MongoDB CRUD示例应用程序

    Node.js-Express-MongoDB CRUD示例应用程序 这是一个使用MongoDB的简单Node.js CRUD应用程序。 它基于 ,具有以下功能: 包括Wercker配置 应用程序更改以在Oracle Container Cloud Service上运行 怎么跑 npm ...

    nodetunes:MongoDB CRUD练习

    "nodetunes" 是一个针对 MongoDB 的 CRUD(创建、读取、更新、删除)操作的实践项目,旨在帮助开发者加深对 MongoDB 和 JavaScript 的使用理解。 在这个项目中,"nodetunes" 涉及到以下关键知识点: 1. **MongoDB ...

    node-express-mongodb-crud-app:节点Express mongodb crud api

    节点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 `...

    php-mongodb-crud:一个简单的 MongoDB 和 PHP CRUD 应用程序

    **PHP与MongoDB CRUD操作详解** 在Web开发中,数据管理是至关重要的,而PHP作为常用的后端语言,经常需要与数据库进行交互。MongoDB是一个流行的NoSQL数据库系统,以其灵活性、可扩展性和高性能受到开发者青睐。本...

    NoSQL之MongoDB的CRUD操作

    NoSQL之MongoDB的CRUD操作 比较全面的MongoDB操作,支持面向对象. 详情http://blog.csdn.net/dengwanchuan/article/details/7514431

    crud-pymongo:使用Python和PyMongo库构建的MongoDB CRUD应用程序

    用Python内置的MongoDB CRUD 该存储库包含一个Python程序,该程序为MongoDB数据库实现基本的CRUD操作。 所有存储库均可通过Docker容器和docker-compose工具运行。项目结构该项目包含database容器, crud模块实现和该...

    mongodb之CRUD小demo

    在本“mongodb之CRUD小demo”中,我们将探讨如何将MongoDB集成到Spring框架中,以便利用Spring提供的强大功能进行数据操作。MongoDB的主要优势在于其灵活性、可扩展性和高性能,而Spring作为Java应用开发的强大框架...

    MongoDB数据库:MongoDB基本CRUD操作PDF

    1.MongoDB的历史和发展 MongoDB,由10gen公司(现更名为MongoDB Inc.)在2007年开始开发,于2009年首次发布。它是一款基于分布式文件存储的开源数据库系统,设计用于处理大量数据并提供高性能的数据访问。MongoDB的名称...

    Go-golangmgo代码自动生成器生成对mongodb的CRUD操作代码

    在Go语言中,MongoDB的官方驱动是mgo(Golang MongoDB Driver)。为了简化开发过程,提高效率,开发者经常使用代码生成工具来自动化创建对数据库的CRUD(创建、读取、更新、删除)操作。"Go-golang mgo代码自动生成...

    mongodb-crud:这用于通过MongoDB在Node.js中进行CRUD操作

    节点mongodb-crud 这用于通过MongoDB在Node.js中进行CRUD操作。 安装 npm install node-mongodb-crud 用法 这用于通过MongoDB在Node.js中建立连接并生成CRUD操作(查找,插入,更新,删除)。 #index.js var ...

    aspnetcore-mongodb-crud:带有MongoDB CRUD的ASP.NET Core Web API

    ASP.NET Core Web API与MongoDB CRUD操作是现代Web开发中的重要技术组合。在这个项目中,开发者使用了ASP.NET Core框架创建了一个Web API服务,该服务能够执行对MongoDB数据库的基本CRUD(创建、读取、更新和删除)...

    mongoDB_CRUD学习资料

    MongoDB 是一个流行的开源...综上所述,MongoDB的CRUD操作涵盖了数据库管理的基础,而`dump`文件则涉及数据的备份与恢复。通过Wangs0622博客的学习,你将能够更全面地掌握MongoDB的使用,并在实际项目中应用这些知识。

Global site tag (gtag.js) - Google Analytics