学习MongoDB 五: MongoDB查询(数组、内嵌文档)(二)

一、简介

我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段,我们今天介绍了对数组和内嵌文档的查询操作,尤其是对$elemMatch 同样可以用在find方法的第二个参数来限制返回数组内的元素,只返回我们需要的文档的介绍。我们经常在查询条件查询内嵌文档数组时,只需要返回主文档并返回内嵌文档数组中我们只需要的值,而不是把内嵌文档的数组都返回。

二、对数组根据条件查询

 $all、$size、$slice、$elemMatch

(1)$all查找数组中包含指定的值的文档

语法:

{ field:{ $all: [ <value> , <value1> ... ]}

例子:

db.orders.find({"books":{$all:["java","mongo"]}})

查找books包含java、mongo的文档数据

(2)$size 查找数组大小等于指定值的文档

语法:

<span style="font-size:18px;">    {field: {$size: number } }</span>

例子:

<span style="font-size:18px;">    db.orders.find({"books":{$size:2}})</span>

(3)$slice查询数组中指定返回元素的个数

语法:

<span style="font-size:18px;">         db.collect.find({},{field:{$slice: number }})</span>

number 说明:

为正数表示返回前面指定的值的个数:例如1 返回数组第一个

为负数表示返回倒数指定的值的个数:例如-1返回数组倒数第一个

例子:

<span style="font-size:18px;">       db.orders.find({"onumber":{$in:["008","009"]}},{books:{$slice:1}})</span>

   1)$slice可以查询数组中第几个到第几个

语法:

<span style="font-size:18px;">        db.collect.find({},{field:{$slice:[ number1, number2] }})</span>

跳过数组的number1个位置然后返回number2个数

number1说明:

为正数表示跳到指定值的数组个数:例如2 跳到数组第3个

为负数表示跳到指定值的数组倒数个数:例如-2跳到到数组倒数第3个

例子:

<span style="font-size:18px;">        db.orders.find({"onumber":{$in:["008","009"]}},{books:{$slice:[1,1]}})</span>

跳过books数组第一个元素,现在到数组第二个元素,并返回1个元素

三、对数组内嵌文档查询

我们先保存数据

<span style="font-size:18px;">
db. orders.insert([
{
        "onumber" : "001",
        "date" : "2015-07-02",
        "cname" : "zcy1",
         "items" :[ {
                   "ino" : "001",
                  "quantity" :2,
                  "price" : 4.0
                 },{
                   "ino" : "002",
                  "quantity" : 4,
                  "price" : 6.0
                }
                ]
},{
         "onumber" : "002",
        "date" : "2015-07-02",
        "cname" : "zcy2",
         "items" :[ {
                  "ino" : "001",
                  "quantity" :2,
                  "price" : 4.0
                   },{
                  "ino" : "002",
                  "quantity" :6,
                  "price" : 6.0
                 }
               ]
}
])</span>

(1)$elemMatch 文档包含有一个元素是数组,那么$elemMatch可以匹配内数组内的元素并返回文档数据

语法:

<span style="font-size:18px;">       {field:{$elemMatch:{ field1:value1, field2:value2,………}}}</span>

例子:

<span style="font-size:18px;">    db.orders.find({"items":{$elemMatch:{"quantity":2}}})</span>

返回quantity为2的文档

也可以这样查询db.orders.find({"items.quantity":2})

(2) $elemMatch可以带多个查询条件

例子:

<span style="font-size:18px;">   db.orders.find({"items":{$elemMatch:{"quantity":4,"ino":"002"}}}) </span>

我们查询数组中的quantity等于4并且ino等于002,但是我们就想返回数组中的quantity等于4并且ino等于002的这个文档,并不想把ino等于001等这些无关的文档返回。

(3)$elemMatch 同样可以用在find方法的第二个参数来限制返回数组内的元素,只返回我们需要的文档

例子:

db.orders.find({"onumber":"001"},{"items":{$elemMatch:{"quantity":4,"ino":"002"}},"cname":1,"date":1,"onumber":1})

 我们只返回quantity等于4并且ino等于002的文档,无关的文档没有返回,方便我们处理数据,这样也可以节省传输数据量,减少了内存消耗,提高了性能,在数据大时,性能很明显的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 19:33:03

学习MongoDB 五: MongoDB查询(数组、内嵌文档)(二)的相关文章

【MongoDB学习笔记18】MongoDB的查询:find查询内嵌文档

查询内嵌文档和查询普通文档完全相同: 例如: > db.post.find()    { "_id" : ObjectId("54ace1394ba07ed75df68f90"), "name" : { "firstname" : "joe", "lastname" : "schome" }, "age" : 28 }     { "

MongoDB 如何查询和修改内嵌文档

MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子对象,而doc中的field可以是原子对象,也可以是内嵌doc(embedded doc),数组等数据类型.内嵌doc中所有field的Key不允许重复. 例如以下doc,contact 字段是内嵌doc. oneDoc= { name:"t1", age:21, contact: { p

mongodb对数组元素及内嵌文档进行增删改查操作(转)

from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: <!-- lang: js --> { "_id" : "195861", "tags" : [ { "tagId" : NumberLong(766), "optDate" : ISODate(&qu

MongoDB对数组元素及内嵌文档进行增删改查操作

比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: {    "_id" : "195861",    "tags" : [            {                    "tagId" : NumberLong(766),                    "optDate" : ISODate("2013-08-12T15

MongoDB查询内嵌文档

有文档如下: /* 0 */ { "_id" : ObjectId("55d09915331c571b60035d95"), "title" : "hello world", "comment" : [{ "author" : "joe", "score" : 3 }, { "author" : "tom",

MongoDB .Net Driver(C#驱动) - 内嵌数组/嵌入文档的操作(增加、删除、修改、查询(Linq 分页))

目录 一.前言 (一) 运行环境 二.前期准备工作 (一) 创建 MongoDBContext MongoDb操作上下文类 (二)创建测试类 (三) 创建测试代码 三.内嵌数组增加元素操作 (一) Update.Set()方法 替换内嵌数组(不推荐使用) (二)Update.Push()方法 直接将元素压入内嵌数组(推荐) (三) Update.PushEach()方法 将多个元素压入内嵌数组(推荐) 四.内嵌数组删除元素操作 (一) Update.Set()方法 替换内嵌数组(不推荐使用) (

MongoDB查询集合中的文档

MongoDB查询集合中的文档 参考资料:http://blog.csdn.net/qq_36040184/article/details/54355085 测试: 集合中插入数据 > db.chenji.insert({"name":"张三","年纪":"三年级","年龄":"14"}) WriteResult({ "nInserted" : 1 }) >

生成带内嵌图片的二维码

在博问上看到有同学在问如何实现一个带内嵌图片的二维码,所以准备记录下来,供同学们参考. 1.首先准备一个用于内嵌的图片. 2.既然生成二维码码,那肯定需要将什么样的内容生成二维码,这里我用http://www.baidu.com作为生成二维码的字符串 private string QcodeSource { get { return "http://www.baidu.com"; } } 3.我们来看看根据QcodeSource生成二维码的方法,这里返回Byte[].PS:这里用了 G

Android官方ORM数据库Room技术解决方案:@Embedded内嵌对象(二)

Android官方ORM数据库Room技术解决方案:@Embedded内嵌对象(二) (一)附录1简介了Android Room的基本使用.在附录1例子中,User对象元素均为普通的Java基本数据类型,但是实际的开发中,通常建立的持久化存储对象复杂,且通常是结构化的Java对象,互相之间存在引用或者内嵌关系. Android Room支持数据库表Java对象通过注解符@Embedded内嵌一个Java对象.这样就像过去的ORM数据库一样,比如构造一个名为Info的Java对象,作为一个成员变量