mongodb对数组中的元素进行查询详解
原文链接:http://blog.csdn.net/renfufei/article/details/78320176
MongoDB中根据数组子元素进行匹配,有两种方式。
- 使用 “[数组名].[子元素字段名]” 的方式进行匹配。
- 使用 “[数组名]” $elemMatch { [子元素字段名] }的方式。
不同点在于所匹配的主体不同。
“[数组名].[子元素字段名]” 的方式匹配的主体为 “[数组名]”, 适用于单个条件,如果是多个条件, 则变成数组子元素之间的“或”运算。
请看示例:
假设某个集合内有2条数据:
document1 如下:
{
"_id" : "123",
"name" : "人文医学",
"qList" : [
{
"qid" : 1,
"content" : "医学伦理学的公正原则",
"reorderFlag" : 1
},
{
"qid" : 2,
"content" : "制定有关人体实验的基本原则",
"reorderFlag" : 0
}
]
}
document2如下:
{
"_id" : "124",
"name" : "人文医学2",
"qList" : [
{
"qid" : 1,
"content" : "医学伦理学的公正原则",
"reorderFlag" : 0
},
{
"qid" : 2,
"content" : "制定有关人体实验的基本原则",
"reorderFlag" : 1
}
]
}
找出数组中, 具有 qid=1并且reorderFlag=0的记录
查询数组内同一条记录同时满足2个条件的语句:
{ "qList": { $elemMatch: { "qid": 1, "reorderFlag": 0} } }
查询结果是:
{
"_id" : "124",
"name" : "人文医学2",
"qList" : [
{
"qid" : NumberInt(1),
"content" : "医学伦理学的公正原则",
"reorderFlag" : NumberInt(0)
},
{
"qid" : NumberInt(2),
"content" : "制定有关人体实验的基本原则",
"reorderFlag" : NumberInt(1)
}
]
}
可以看到, 其执行结果是, 对数组内的每一个子元素, 执行 $elemMatch 匹配, 可以进行多个条件的匹配。
找出数组中, qid=1 或者 reorderFlag=0的记录
数组整体能满足以下2个条件:
{ "qList.qid": 1, "qList.reorderFlag": 0}
执行的主体是 qList, 要求: 有某些子元素满足 qid=1, 也要有某些子元素满足 reorderFlag=0`。
查询结果是:
{
"_id" : "123",
"name" : "人文医学",
"qList" : [
{
"qid" : NumberInt(1),
"content" : "医学伦理学的公正原则",
"reorderFlag" : NumberInt(1)
},
{
"qid" : NumberInt(2),
"content" : "制定有关人体实验的基本原则",
"reorderFlag" : NumberInt(0)
}
]
}
{
"_id" : "124",
"name" : "人文医学2",
"qList" : [
{
"qid" : NumberInt(1),
"content" : "医学伦理学的公正原则",
"reorderFlag" : NumberInt(0)
},
{
"qid" : NumberInt(2),
"content" : "制定有关人体实验的基本原则",
"reorderFlag" : NumberInt(1)
}
]
}
可以看到, 其执行结果是, 对数组进行匹配, 其中需要有子元素 满足 "qList.qid": 1, 还需要有子元素 满足 "qList.qid": 1, , 适合进行单个条件的匹配。
如果是单个条件匹配, 则以下方式结果是一样的。
{ "qList.qid": 1}
或者
{ "qList": { $elemMatch: { "qid": 1} } }
查询的结果都是2条记录
mongodb对数组中的元素进行查询详解的更多相关文章
- MongoDB 更新数组中的元素
本文记录如何更新MongoDB Collection 中的Array 中的元素.假设Collection中一条记录格式如下: 现要删除scores 数组中,"type" 为 &qu ...
- PHP实现查询两个数组中不同元素的方法
以下实例讲述了PHP实现查询两个数组中不同元素的方法.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...
- MongoDB 学习笔记之 从数组中删除元素和指定数组位置
从数组中删除元素: 从数组中删除单个元素: db.ArrayTest.updateOne({ "name" : "Bill"},{$pop: {"ad ...
- 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果
package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...
- php 去除数组中重复元素
去除数组中重复元素, 找了下可以一下两个函数 php array_flip()与array_uniqure() $arr = array(…………) ;// 假设有数组包含一万个元素,里面有重复的元素 ...
- 将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件
将String类型的二维数组中的元素用FileOutputStream的write方法生成一个文件import java.io.File;import java.io.FileOutputStre ...
- 功能要求:定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素。
功能要求:定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素 names={{"tom","jack","mike&qu ...
- 【LeetCode每天一题】Find First and Last Position of Element in Sorted Array(找到排序数组中指定元素的开始和结束下标)
Given an array of integers nums sorted in ascending order, find the starting and ending position of ...
- 数组中的元素 增加push用法 unshift() 方法 和减少pop() 方法 shift() 和其他位置增删 splice() 方法 join() 方法 reverse() 方法 sort() 方法
push用法 push 英 [pʊʃ] 美 [pʊʃ] vt. 推,推动; vt. 按; 推动,增加; 对…施加压力,逼迫; 说服; n. 推,决心; 大规模攻势; 矢志的追求 定义和用法 push( ...
随机推荐
- Qt中int转换成QString
(1) QString QString::number ( long n, int base = 10 ) [static] examle: long a = 48; QString s = QStr ...
- keepalived之 ipvsadm-1.26-4(lvs)+ keepalived-1.2.24 安装
一.安装 LVS 前提:已经提前配置好本地 Yum 源 配置过程可参考> http://blog.csdn.net/zhang123456456/article/details/56690945 ...
- GMT时间
GMT:格林尼标准时间 北京时间=GMT时间+8小时
- unix下网络编程之I/O复用(五)
前言 本章节是用基本的Linux/Unix基本函数加上select调用编写一个完整的服务器和客户端例子,可在Linux(ubuntu)和Unix(freebsd)上运行,客户端和服务端的功能如下: 客 ...
- RazorHelper.cs
完整版 RazorHelper.cs using System; using System.Collections; using System.Collections.Generic; using S ...
- -3dB的理解
-3dB到底是什么?集成运放-3dB带宽又是什么? 以无源高通电路为例,介绍-3dB的意义. 输出与输入只比: Au=Uo/Ui=R/(R+1/j*2*PI*f*C)=1/(1+1/j*2*PI*f* ...
- (转)红帽 Red Hat Linux相关产品iso镜像下载【百度云】【更新6.7 Boot Disk】
不为什么,就为了方便搜索,特把红帽EL 5.EL6 的各版本整理一下,共享出来. RedHat Enterprise Server 6.7 for i386 Boot Disk:rhel-server ...
- DataGridview刷新异常的问题
datsSet 绑定到dataGrieView,在刷新dataSet的数据时,常会bug:索引0没有值或索引(int)x没有值 昨天弄了一个下午,发现bug原因: dataGridView中有数据时, ...
- str.split和re.split中空格的区别
一.str.split和re.split的基本用法 1.str.spli的基本用法 现用下面的文件: 1 maqing:abc123 我们要建立一个用户名和用户密码的匹配关系: with open(& ...
- 机器学习:逻辑回归(OvR 与 OvO)
一.基础理解 问题:逻辑回归算法是用回归的方式解决分类的问题,而且只可以解决二分类问题: 方案:可以通过改造,使得逻辑回归算法可以解决多分类问题: 改造方法: OvR(One vs Rest),一对剩 ...