MongoDB如何对数组中的元素进行查询详解

栏目: 数据库 · MongoDB · 发布时间: 7年前

内容简介:MongoDB在文档上支持数组,其次数组上可以实现嵌套,以及数组元素也可以文档。所以下面这篇文章主要给大家介绍了关于MongoDB如何对数组中元素进行查询的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

MongoDB是文档型数据库,每个文档(doc)表示数据的一项记录。相比关系型DB的row只能使用简单的数据类型,doc能够使用复杂的数据类型:内嵌doc,数组。MongoDB的数组是一系列元素的集合,使用中括号 [] 表示数组,例如:[1,2,3]的元素是整数值,[{name:"t5"}, {name:"t7"}],[ {name:"t5", age:21}, {name:"t7", age:22} ]的元素是doc。

MongoDB 中,数组元素允许重复,元素的位置是固定的。如果两个数组相等,那么这两个数组的元素和及其位置都相同。

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条记录。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对Codercto.com的支持。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Agile Web Development with Rails, Third Edition

Agile Web Development with Rails, Third Edition

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95

Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具