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

  • A+
所属分类: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笔记录。

总结

以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。

您可能感兴致的文章:

MongoDB下依据数组年夜小进行查询的办法mongodb 数据类型(null/字符串/数字/日期/内嵌文档/数组等)mongoDB 多重数组查询(AngularJS绑定显示 nodejs)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: