mongodb查询指定的数组长度:$size

文章介绍了在MongoDB中如何使用$size操作符查询数组字段的长度,强调了$size需要传入数字参数。同时,针对查询数组长度大于某个值的情况,由于$size不支持比较操作符,提出了使用$where操作符结合JavaScript表达式的方法。此外,文中讨论了一种解决方案,即新增size字段并动态更新,但对这种方法的有效性和必要性提出了疑问。
摘要由CSDN通过智能技术生成

根据数组字段的长度查找文档:$size

$size:返回数组中的元素数,也就是数组长度。

⚠️ 期望传入的参数是一个数字,不能是表达式

通过以下实例来理解:

数据准备:

  • 数据库:test
  • 集合:person

提前定义数据集:persons.json

var persons = [{
name:"jim", age:25,
email:"75431457@qq.com", c:89,m:96,e:87,
country:"USA", books:["JS","C++","EXTJS","MONGODB"]
},
{
name:"tom", age:25,
email:"214557457@qq.com", c:75,m:66,e:97,
country:"USA", books:["PHP","JAVA","EXTJS","C++"]
},
{
name:"holiday", age:26,
email:"344521457@qq.com", c:75,m:63,e:97,
country:"USA", books:["JS","JAVA","C#","MONGODB"]
},
{
name:"zhangsan", age:27,
email:"2145567457@qq.com", c:89,m:86,e:67,
country:"China", books:["JS","JAVA","EXTJS","MONGODB"]
},
{
name:"lisi", age:26,
email:"274521457@qq.com", c:53,m:96,e:83,
country:"China", books:["JS","C#","PHP","MONGODB"]

},
{
name:"wangwu", age:27,
email:"65621457@qq.com", c:45,m:65,e:99,
country:"China", books:["JS","JAVA","C++","MONGODB"]
},
{
name:"zhaoliu", age:27,
email:"214521457@qq.com", c:99,m:96,e:97,
country:"China", books:["JS","JAVA","EXTJS","PHP"]
},
{
name:"piaoyingjun", age:26,
email:"piaoyingjun@uspcat.com", c:39,m:54,e:53,
country:"Korea", books:["JS","C#","EXTJS","MONGODB"]
},
{
name:"lizhenxian", age:27,
email:"lizhenxian@uspcat.com", c:35,m:56,e:47,
country:"Korea", books:["JS","JAVA","EXTJS","MONGODB"]
},
{
name:"lihuiying", age:21,
email:"lihuiying@uspcat.com", c:36,m:86,e:32,
country:"Korea", books:["JS","JAVA","PHP","MONGODB"]
},
{
name:"zhangsuying", age:22,

email:"zhangsuying@uspcat.com", c:45,m:63,e:77,
country:"Korea", books:["JS","JAVA","C#","MONGODB"]
}]

利用for循环将数据集插入

for(var i = 0;i<persons.length;i++){
db.persons.insert(persons[i])
}

books信息如下:

在这里插入图片描述

例题1:查询喜欢的书籍数量是4本的学生

分析
  • 数据库 ➡️ test
use test
  • 集合 ➡️ persons
  • 函数 ➡️ find()
  • 喜欢的书籍 ➡️ books
  • 4本 ➡️ {books:{$size:4}}
  • 投影显示信息 ➡️ {_id:0,name:1,books:1}
查询语句
db.persons.find({books:{$size:4}},{_id:0,name:1,books:1})

在这里插入图片描述

可以看出,以上查询的结果中,books数组的长度都是4

例题2:查询出喜欢书籍数量大于3本的学生

⚠️核心:$size不可以❌与比较查询符一起使用
# 错误用法:
db.persons.find({books:{$size:{$gt:3}}},{_id:0,books:1})
# 报错:
Failed to parse $size. Expected a number in: $size: { $gt: 3 }
# 译文:
$size操作符期望传入的是一个数字,但是您传入的却不是数字,可能是一个$gt操作符。
请您检测传入的参数是否正确,确保传入的参数是数字类型。
⚠️正确的实现步骤如下:

引入$where操作符:

可以将JavaScript表达式的字符串或 JavaScript函数作为查询语句的一部分。

db.persons.find({$where: "this.books.length > 3"})

在这里插入图片描述

有一个问题,我在网上查过的一些例题都显示的解决办法如下:

step1:增加一个字段:size

# 之前的版本
db.persons.update({},{$set:{size:4}},false,true)
# 新版本
db.persons.updateMany({},{$set:{size:4}})

step2:改变书籍的更新方式,每次增加书籍的时候,size➕1

db.persons.update({查询器},{$push:{books:"ORACLE"},$inc:{size:1}})

step3:利用$gt查询

db.persons.find({size:{$gt:3}})

但是事实上,我完全没理解这个step2是怎么理解的,感觉好像是错的?或者有哪里我没想到?在此记录一下自己的疑问。

同时希望有大佬可以看到这里,顺手帮我解决这个难题🌝

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值