设为首页 收藏本站
查看: 979|回复: 0

[经验分享] MongoDB 查询下

[复制链接]

尚未签到

发表于 2015-7-5 13:47:57 | 显示全部楼层 |阅读模式
  1.查询内嵌文档
  有两种方法查询内嵌文档:查询整个文档,或者只针对其键值对进行查询
  查询整个内嵌文档与普通查询相同
  如:
  db.users.insert(
  {
    "name":
    {
      "first":"refactor",
      "last":"refactor2"
    },
    "age":24
  }
)
  查找姓名为refactor的文档
  db.users.find({"name":{"first":"refactor","last":"refactor2"}})
  但是
  db.users.find({"name":{"first":"refactor"}})这样不能查询出文档.
  
  所以最好通过内嵌文档的特定的键值来进行查找.这样即便数据模式改变,也不会导致查询失效.
  如:
  db.users.find({"name.first":"refactor","name.last":"refactor2"})
db.users.find({"name.first":"refactor"})//这个也可以查出文档.
  
  查询文档可以包含点,来表示"深入内嵌文档内部"的意思.点表示法也是待插入的文档不能包含"."的原因.
  
  当文档结构变得更加复杂后,内嵌文档的匹配需要技巧
  如:
  db.blog.insert(
  {
    "title":"refactor's blog",
    "Content":"refactor's blog test",
    "comments":
    [
      {
        "author":"refactor",
        "score":3,
        "commnent":"nice"
      },
      {
        "author":"refactor2",
        "score":6,
        "commnent":"good"
      }
    ]
  }
)
  要查询键author为refactor,score大于等于5的评论
  不能使用
  db.blog.find(
  {"comments":{"author":"refactor","score":{"$gte":5}}}
)来查询.
  内嵌文档匹配要求整个内嵌文档完全匹配,而这不会匹配"comments"键.使用
  db.blog.find(
  {"comments.author":"refactor","comments.score":{"$gte":5}}
)也不会达到目的,因为符合author条件的评论和符合score条件的评论可能不是同一条评论.也就是说,
  会返回刚才显示的那个文档.因为"author":"refactor"在第一条评论中匹配了,"score":6在第二条评论中匹配了.
  
  要正确指定一组条件,而不用指定每个键,要使用"$elemMatch".这种模糊的命名条件能用来部分指定匹配数组中
  的单个内嵌文档的限定条件.正确写法应该是:
  db.blog.find(
  {
    "comments":
    {
      "$elemMatch":
      {
        "author":"refactor",
        "score":{"$gte":5}
      }
    }
  }
)
  "$elemMatch"将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才会用到.
  
  2."$where"查询
  "$where"可以执行任意javascript作为查询的一部分.这使得查询能做(几乎)任何事情.
  最典型的应用就是比较文档中的两个键的值是否相等.
  如:
  db.blog.insert({"title":"refactor","content":"refactor"})
db.blog.insert({"title":"refactor1","content":"refactor content"})
  第一个文档title键和content键的值相同.要返回该文档.
DSC0000.jpg
  db.blog.find(
  {
    "$where":function()
          {
            for(var current in this)
            {
              for(var other in this)
              {
                if(current!=other&&this[current]==this[other])
                {
                  return true;
                }
              }
            }
            return false;
          }
  }
)
如果函数返回true,文档就作为结果的一部分被返回.
  
  上面是用一个函数,也可以用一个字符串指定"$where"查询.下面两种方式是等价的:
  db.blog.find({"$where":"this.x+this.y==10"})
db.blog.find({"$where":"function(){return this.x+this.y==10;}"})
  不是非常必要时,应避免"$where"查询.它在速度上要比常规查询慢的多.每个文档都要从BSON转换成
  javascript对象,然后通过"$where"的表达式来运行.它还不能利用索引.
  将常规查询作为前置过滤,与"$where"组合使用才能不牺牲性能,如果有可能的话,用索引根据非"$where"
  子句进行过滤,"$where"只用于对结果进行调优.
  
  3.游标
  数据库使用游标来返回find的执行结果.客户端对游标的实现通常能够对最终结果进行有效的控制.可以限制
  结果的数量,略过部分结果,根据任意方向任意键的组合对结果进行各种排序,或者是执行其他一些强大的操作.
  要想在shell中创建一个游标,首先要对集合填充一些文档,然后对齐执行查询,并将结果分配给一个局部变量.
  如:
  for(i=0;i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83396-1-1.html 上篇帖子: MongoDB 副本集的搭建、应用 下篇帖子: MongoDB入门下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表