1 字符串数组相关的查询

测试数据还是用的上篇文章的测试数据
用法举例如下:

  • 利用数组中单个元素查找】—> 查询喜欢的城市里包含西安的用户
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")
        }
    ]
}