find的数组查询


完善数据

以前的我们的workmate集合对数组涉及还很少,现在在数据中加入了兴趣(interest),并且给每个人加入了一些兴趣,比如有写代码,做饭,看电影…..

var workmate1={
    name:'panpan',
    age:24,
    sex:1,
    job:'前端',
    skill:{
        skillOne:'HTML+CSS',
        SkillTwo:'JavaScript',
        SkillThree:'PHP'
    },
    regeditTime:new Date(),
    interest:['看电影','看书','美食','钓鱼','旅游']
}

var workmate2={
    name:'panda',
    age:20,
    sex:1,
    job:'JAVA后端',
    skill:{
        skillOne:'HTML+CSS',
        SkillTwo:'J2EE',
        SkillThree:'PPT'
    },
    regeditTime:new Date(),
    interest:['篮球','看电影','做饭']
}

var workmate3={
    name:'jspan',
    age:20,
    sex:1,
    job:'UI设计',
    skill:{
        skillOne:'PhotoShop',
        SkillTwo:'UI',
        SkillThree:'Word+Excel+PPT'
    },
    regeditTime:new Date(),
    interest:['做饭','画画','看电影']
}
var workmate4={
    name:'xiaowang',
    age:26,
    sex:1,
    job:'UI设计',
    skill:{
        skillOne:'PhotoShop',
        SkillTwo:'UI',
        SkillThree:'Word+Excel+PPT'
    },
    regeditTime:new Date(),
    interest:['画画','聚会','看电影']
}

var db=connect('company');
var workmateArray=[workmate1,workmate2,workmate3,workmate4];
db.workmate.insert(workmateArray);
print('[SUCCESS]:The data was inserted successfully');

基本数组查询

比如现在我们知道了一个人的爱好是’画画’,’聚会’,’看电影’,但我们不知道是谁,这时候我们就可以使用最简单的数组查询(实际工作中,这种情况基本不常用,所以这种查询只作知识点储备就可以了)。

db.workmate.find({interest:['画画','聚会','看电影']},
    {name:1,interest:1,age:1,_id:0} 
)

结果为:

{ "name" : "xiaowang", "age" : 26, "interest" : [ "画画", "聚会", "看电影" ] }

这时候我们说,想查出看兴趣中有看电影的员工信息。按照正常逻辑,应该使用下面的代码。

db.workmate.find({interest:['看电影']},
    {name:1,interest:1,age:1,_id:0} 
)

运行后,并没有如我们所愿得到相应的人员数据,数据为空。那问题出现在哪里?问题就在于我们写了一个中括号([]),因为加上中括号就相当于完全匹配了,所以没有得到一条符合查询条件的数据。我们去掉中括号再看看结果。

db.workmate.find({interest:'看电影'},
    {name:1,interest:1,age:1,_id:0} 
)

结果为:

{ "name" : "panpan", "age" : 24, "interest" : [ "看电影", "看书", "美食", "钓鱼", "旅游" ] }
{ "name" : "panda", "age" : 20, "interest" : [ "篮球", "看电影", "做饭" ] }
{ "name" : "jspan", "age" : 20, "interest" : [ "做饭", "画画", "看电影" ] }
{ "name" : "xiaowang", "age" : 26, "interest" : [ "画画", "聚会", "看电影" ] }

这就是我们在数组中查询一项的方法,这也是数组查询的最简单用法。

$all-数组多项查询

现在我们的条件升级了,要查询出喜欢看电影和看书的人员信息,也就是对数组中的对象进行查询,这时候要用到一个新的查询修饰符$all。看下面的例子:

db.workmate.find(
    {interest:{$all:["看电影","看书"]}},
    {name:1,interest:1,age:1,_id:0} 
)

结果为:

{ "name" : "panpan", "age" : 24, "interest" : [ "看电影", "看书", "美食", "钓鱼", "旅游" ] }

这时候找到了兴趣中既有看电影又有看书的人员。

$in-数组的或者查询

用$all修饰符,是需要满足所有条件的,$in主要满足数组中的一项就可以被查出来(有时候会跟$or弄混)。比如现在要查询爱好中有看电影的或者看书的员工信息。

db.workmate.find(
    {interest:{$in:["看电影","看书"]}},
    {name:1,interest:1,age:1,_id:0} 
)

结果为:

{ "name" : "panpan", "age" : 24, "interest" : [ "看电影", "看书", "美食", "钓鱼", "旅游" ] }
{ "name" : "panda", "age" : 20, "interest" : [ "篮球", "看电影", "做饭" ] }
{ "name" : "jspan", "age" : 20, "interest" : [ "做饭", "画画", "看电影" ] }
{ "name" : "xiaowang", "age" : 26, "interest" : [ "画画", "聚会", "看电影" ] }

$size-数组个数查询

$size修饰符可以根据数组的数量查询出结果。比如现在我们要查找兴趣的数量是5个人员信息,这时候就可以使用$size。

db.workmate.find(
    {interest:{$size:5}},
    {name:1,interest:1,age:1,_id:0} 
)

结果为:

{ "name" : "panpan", "age" : 24, "interest" : [ "看电影", "看书", "美食", "钓鱼", "旅游" ] }

这时候是5项爱好的人员就会显示出来了。

$slice-显示选项

有时候我并不需要显示出数组中的所有值,而是只显示前两项,比如我们现在想显示每个人兴趣的前两项,而不是把每个人所有的兴趣都显示出来。

db.workmate.find(
    {},
    {name:1,interest:{$slice:2},age:1,_id:0} 
)

结果为:

{ "name" : "panpan", "age" : 24, "interest" : [ "看电影", "看书" ] }
{ "name" : "panda", "age" : 20, "interest" : [ "篮球", "看电影" ] }
{ "name" : "jspan", "age" : 20, "interest" : [ "做饭", "画画" ] }
{ "name" : "xiaowang", "age" : 26, "interest" : [ "画画", "聚会" ] }

这时候就显示出了每个人兴趣的前两项,如果我们想显示兴趣的最后一项,可以直接使用slice:-1,来进行查询。

db.workmate.find(
    {},
    {name:1,interest:{$slice:-1},age:1,_id:0} 
)

结果为:

{ "name" : "panpan", "age" : 24, "interest" : [ "旅游" ] }
{ "name" : "panda", "age" : 20, "interest" : [ "做饭" ] }
{ "name" : "jspan", "age" : 20, "interest" : [ "看电影" ] }
{ "name" : "xiaowang", "age" : 26, "interest" : [ "看电影" ] }

文章作者: 技术潘
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 技术潘 !
  目录