MongoDB总结整理2 --- mongodb文档查询2【字符串数组+对象数组】

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")
        }
    ]
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值