资讯专栏INFORMATION COLUMN

mongodb 重温之路 ( 二 )

qianfeng / 3117人阅读

</>复制代码

  1. 插入文档

mongodb 查询使用 find() 方法。

</>复制代码

  1. db.collection.find(query, projection)
  2. * query 可选,使用查询操作符指定查询条件
  3. * projection 可选,使用投影操作符指定返回的键
  4. // 如果想以易读的方式读出,使用 `pretty()`
  5. db.col.find().pretty()
  6. // 除了find() 之外还有 findOne() 顾名思义是只找一个

AND

</>复制代码

  1. db.col.find({"title":"zjj" , "sex":"男"})

OR

</>复制代码

  1. db.col.find({$or[{key: val1}, {key1: val2}]})

OR 和 AND

</>复制代码

  1. db.col.find({"like": {$gt: 50}, $or:[{"by":"zjj"},{"title":"zjjasdada"}]})

</>复制代码

  1. 条件操作符
一、查询于投影
1.1 比较运算符
$eq

</>复制代码

  1. // =
  2. // 查询 age = 20
  3. db.person.find({ age: { $eq: 20 } })
  4. // 相当于
  5. db.person.find({age: 20})
$gt

</>复制代码

  1. // >
  2. // 查询 age > 20
  3. db.person.find({age: {$gt: 20}})
$lt

</>复制代码

  1. // <
  2. // 查询 age < 20
  3. db.person.find({age: {$lt: 20}})
$gte

</>复制代码

  1. // >=
  2. // 查询 age >= 20
  3. db.person.find({age: {$gte: 20}})
$lte

</>复制代码

  1. // <=
  2. // 查询 age <= 20
  3. db.person.find({age: {$lte: 20}})
$ne

</>复制代码

  1. // ≠
  2. // 查询 age ≠ 20
  3. db.person.find({age: {$ne: 20}})
$in

</>复制代码

  1. // ≠
  2. // 匹配数组中的任一值
  3. db.person.find({qyt: {$in :[5, 12]}})
$nin

</>复制代码

  1. // nin
  2. // 不匹配数组中的值
  3. db.person.find({qty : {$nin: [2,322]}})
1.2 逻辑运算符
$or

</>复制代码

  1. // 或 条件查询
  2. db.person.find({$or: [{age: {$lt: 20}},{address: "beijing"}]})
$and

</>复制代码

  1. // 且 条件查询
  2. db.person.find({$and: [{age: {$lt: 20}},{address: "beijing"}]})
$not

</>复制代码

  1. // 查询与表达式不匹配的文档
  2. db.person.find({age: {$not: {$gt: 20}}});
$nor

</>复制代码

  1. // 查询与任一表达式都不匹配的文档
  2. db.col.find({$nor: [{age: 20}, {sex: "男"}]}})
1.3 元素运算符
$exists

</>复制代码

  1. // 查询存在指定字段的文档
  2. // 查询存在phone字段的文档:
  3. db.col.find({phone: {$exists: true}})
$type

</>复制代码

  1. // 查询类型为指定类型的文档,3.2版本添加alias别名,各种类型的Number及Alias如下

</>复制代码

  1. // 假设有
  2. { "_id": 1, address: "2030 Martian Way",zipCode: "90698345"},
  3. { "_id": 2, address: "156 Lunar Place",zipCode: 43339374},
  4. { "_id": 3, address: "2324 Pluto Place",zipCode: NumberLong(3921412)},
  5. { "_id": 4, address: "55 Saturn Ring", zipCode: NumberInt(88602117)}
  6. // 查询该集合中zipCode字段的数据类型为String类型的文档:
  7. db.col.find({zipCode: {$type: "string"}});
  8. db.addressBook.find( { "zipCode" : { $type : 2 } } );
1.4 元素运算符
$mod

</>复制代码

  1. // 取余条件查询
  2. // 查询age字段的值除以2余0的文档:
  3. db.person.find( { age: {$mod : [2, 0] } } )
$regex

</>复制代码

  1. // 正则表达式查询
  2. db.person.find({sku: { $regex: /^ABC/i }})
$text

</>复制代码

  1. // 文本索引查询
  2. {
  3. $text: {
  4. $search: ,
  5. $language: ,
  6. $caseSensitive: ,
  7. $diacriticSensitive:
  8. }
  9. }
  10. // 具体请查看官方文档
$where

</>复制代码

  1. // 可以支持字符穿或者是函数
  2. db.myCollection.find( { $where: "this.credits == this.debits" } );
  3. db.myCollection.find( { $where: function() { return obj.credits == obj.debits; } } );
1.5 数组操作符
$all

</>复制代码

  1. // 匹配文档的数组字段中包含所有指定元素的文档
  2. 查询articles集合中tags字段(是个数组)包含“ssl”和“security”的文档(包含,但并不是全部等于)
  3. db.articles.find({tagS: { $all:[ ["aal", "dsada"] ] } })
$elemMatch()

</>复制代码

  1. 匹配内嵌文档或数组中的部分field
  2. // 假设有
  3. { _id: 1, results: [ 82, 85, 88 ] }
  4. { _id: 2, results: [ 75, 88, 89 ] }
  5. db.col.find({results: { $elemMatch: { $gte: 80, $lt: 85} } });
  6. // 查询results数组中含有区间[80,85)元素的文档(结果为第一条);
$size

</>复制代码

  1. // 匹配数组长度为指定大小的文档
  2. 查询已经集齐了5张福卡的文档:
  3. db.person.find({card:{$size:5}})
1.6投影操作符
$(projection)

</>复制代码

  1. //查询数组中首个匹配条件的元素,相当于findOne()方法
  2. { "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] }
  3. { "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] }
  4. { "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] }
  5. { "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] }
  6. { "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] }
  7. { "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] }
  8. db.student.find({semester : 1 , grades: {$gte: 85}}, {"grades.$": 1});
  9. 查询semester=1,并且grades中符合大于等于85的元素的第一个元素:
  10. // 查询结果是
  11. { "_id" : 1, "grades" : [ 87 ] }
  12. { "_id" : 2, "grades" : [ 90 ] }
  13. { "_id" : 3, "grades" : [ 85 ] }
$(projection)

</>复制代码

  1. {
  2. _id: 1,
  3. zipcode: "63109",
  4. students: [
  5. { name: "john", school: 102, age: 10 },
  6. { name: "jess", school: 102, age: 11 },
  7. { name: "jeff", school: 108, age: 15 }
  8. ]
  9. }
  10. {
  11. _id: 2,
  12. zipcode: "63110",
  13. students: [
  14. { name: "ajax", school: 100, age: 7 },
  15. { name: "achilles", school: 100, age: 8 },
  16. ]
  17. }
  18. {
  19. _id: 3,
  20. zipcode: "63109",
  21. students: [
  22. { name: "ajax", school: 100, age: 7 },
  23. { name: "achilles", school: 100, age: 8 },
  24. ]
  25. }
  26. //查询zipcode为63109并且students数组中school=102的文档:
  27. db.school.find({ zipcode: "63109" }, {student: { $elemMatch: { school: 102 } } } )
  28. // result
  29. { "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }
  30. { "_id" : 3 }
$slice

</>复制代码

  1. // 在查询中将数组进行切片(类似于分页)
  2. (1)查询结果中,对于comments数组的元素只显示前5个:
  3. db.posts.find( {}, { comments: { $slice: 5 } } )
  4. (2)查询结果中,对于comments数组的元素只显示后5个:
  5. db.posts.find( {}, { comments: { $slice: -5 } } )
  6. (3)查询结果中,对于comments数组的元素跳过(skip)前20个,并只显示(limit)10个元素(即21-30):
  7. db.posts.find( {}, { comments: { $slice: [ 20, 10 ] } } )
  8. (4)同理,跳过后20个,并显示10个:
  9. db.posts.find( {}, { comments: { $slice: [ -20, 10 ] } } )

</>复制代码

  1. skip 和 Limit

limit

</>复制代码

  1. // 获取20条
  2. db.things.find().limit(20);

limit

</>复制代码

  1. // 跳过20.再选20条
  2. db.things.find().skip(20).limit(20)

</>复制代码

  1. 排序

</>复制代码

  1. db.things.find().sort({"likes":-1}) -1表示倒序排列

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19220.html

相关文章

  • mongode 重温之路 ( 一 )

    摘要:再次查看删除数据库删除当前所在的数据库创建集合创建默认的集合创建带有参数的集合创建集合可以使用下面的方法参数配置如下字段类型描述布尔如果为,则创建固定集合。布尔可选如为,自动在字段创建索引。数值可选为固定集合指定一个最大值以字节计。 以windows服务启动mongodb // 创建目录 d: data/ conf -->配...

    mj 评论0 收藏0
  • MongoDB ( 四 )高级_find修饰符

    摘要:返回内容查询出来后显示的结果样式,可以用和控制是否显示。修饰符文件使用进行链接对应的集合声明变量,并把查询结果赋值给利用游标的进行循环输出结果。到此的基础操作就结束了,但是我们还没有结束呢,下一节我们会用配合使用哦 find查询操作是我们平时再开发中最常用的,也是重中之重。 find基本操作符 // 批量插入数据 var workmate1={ name:JSPang, ag...

    crossea 评论0 收藏0
  • 【全栈之路】JAVA基础课程六_集合(20190615v1.0)

    摘要:欢迎进入基础课程博客地址本系列文章将主要针对一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。是同步的,而不是。因此,更适合于单线程环境,而适合于多线程环境。 欢迎进入JAVA基础课程 博客地址:https://blog.csdn.net/houjiyu...本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总...

    dkzwm 评论0 收藏0
  • 【全栈之路】JAVA基础课程六_集合(20190615v1.0)

    摘要:欢迎进入基础课程博客地址本系列文章将主要针对一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。是同步的,而不是。因此,更适合于单线程环境,而适合于多线程环境。 欢迎进入JAVA基础课程 博客地址:https://blog.csdn.net/houjiyu...本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总...

    tain335 评论0 收藏0

发表评论

0条评论

qianfeng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<