测试数据还是用的上篇文章的测试数据
用法举例如下:
- 【利用数组中单个元素查找】—> 查询喜欢的城市里包含西安的用户
db.users.find({"favorites.cites":"西安" })
- 【利用数组索引查找】—> 查询喜欢的城市列表中第三个为上海的用户
db.users.find({"favorites.cites.2":"上海"})
- 【利用数组进行精确查找】,在上篇文章其实也讲过—> 查询数组等于[ “杀破狼2”, “战狼”, “雷神1” ]的文档,
严格按照数量、顺序
;
db.users.find({"favorites.movies":[ "杀破狼2", "战狼", "雷神1" ]})
-
$all的用法
—> 查询数组包含[“雷神1”, “战狼” ]的文档,跟顺序无关,跟数量有关
db.users.find({"favorites.movies":{"$all":["战狼","雷神1"]}})
-
$slice的用法
【注意:其实是在Projection即映射中使用的】返回数组子集
(1)【$slice后一个参数的情况】查询username为lison的用户所喜欢的电影中的前2个
db.users.find({"username":"lison"},{"favorites.movies":{"$slice":2}})
(2)【$slice后一个参数的情况】查询username为lison的用户所喜欢的电影中的后2个
db.users.find({"username":"lison"},{"favorites.movies":{"$slice":-2}})
【$slice后两个参数[skip,limit]的情况,与mysql中limit后的两个参数意义相同】
(3) 查询lison所喜欢电影 —> 跳过第一个后的两个即第二个和第三个
db.users.find({"username":"lison"},{"favorites.movies":{"$slice":[1,2]}})
(4)查询lison所喜欢电影 —> 倒数第3项起往后的两个元素(假如3个元素,得到的就是1和2两个元素)
db.users.find({"username":"lison"},{"favorites.movies":{"$slice":[-3,2]}})
注意: 上面的查询方式除了会按照指定的规则查询到相应的movies,还会把用户对象里的其他元素一并查出,如果不需要可以在映射里进行指定,可以亲自动手试一下,一定会让你感到吃惊的
2 对象数组相关的查询
测试数据在末尾:
- 【利用数组中单个元素查找】
db.users.find({
"comments": {
"author" : "yoyo6",
"content" : "yoyo评论6",
"commentTime" : ISODate("2017-11-06T05:26:18.000+0000")
}
})
- 【$in查找符
跟数量无关,跟顺序无关
】—>查找yoyo1 或者 yoyo22评论过的user
db.users.find({"comments.author":{"$in":["yoyo1","yoyo22"]}})
- 【$all查找符
跟数量无关,跟顺序无关
】—> 查找yoyo1 和 yoyo12都评论过的user
db.users.find({"comments.author":{"$all":["yoyo12","yoyo1"]}})
- 【$elemMatch查找符
全元素匹配,和顺序无关
】 —> 查找评论中包含yoyo1的评论,且其评论内容包含苍老师的用户—>只能查到james用户
db.users.find({"comments":{"$elemMatch":{"author" : "yoyo1","content" : {"$regex" : ".*苍老师.*"}}}})
本文第2部分测试数据
{
"_id" : ObjectId("5d46e6b42a142a3571abd905"),
"username" : "deer",
"comments" : [
{
"author" : "yoyo1",
"content" : "yoyo评论1",
"commentTime" : ISODate("2017-10-06T00:00:00.000+0000")
},
{
"author" : "yoyo22",
"content" : "XXX苍老师OOO",
"commentTime" : ISODate("2017-11-06T00:00:00.000+0000")
},
{
"author" : "yoyo16",
"content" : "yoyo评论12",
"commentTime" : ISODate("2017-11-06T00:00:00.000+0000")
}
]
}
{
"_id" : ObjectId("5d46e6b42a142a3571abd904"),
"username" : "james",
"comments" : [
{
"author" : "yoyo1",
"content" : "XXX苍老师OOO",
"commentTime" : ISODate("2017-10-06T00:00:00.000+0000")
},
{
"author" : "yoyo6",
"content" : "yoyo评论6",
"commentTime" : ISODate("2017-11-06T05:26:18.000+0000")
},
{
"author" : "yoyo12",
"content" : "yoyo评论12",
"commentTime" : ISODate("2017-11-06T00:00:00.000+0000")
}
]
}