怎么在MongoDB中对数组中的元素进行查询

45次阅读
没有评论

共计 2002 个字符,预计需要花费 6 分钟才能阅读完成。

自动写代码机器人,免费开通

怎么在 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 中对数组中的元素进行查询的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-16发表,共计2002字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)