根据数组字段的长度查找文档:$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
是怎么理解的,感觉好像是错的?或者有哪里我没想到?在此记录一下自己的疑问。
同时希望有大佬可以看到这里,顺手帮我解决这个难题🌝