MongoDB 操作符

管道操作符

Name Description
$project 包含、排除、重命名和显示字段
$match 查询,需要同 find() 一样的参数
$limit 限制结果数量
$skip 忽略结果的数量
$sort 按照给定的字段排序结果
$group 按照给定表达式组合结果
$unwind 分割嵌入数组到自己顶层文件

比较类型操作符

  • $gt 大于 (>)
  1. db.user.find({"hours": {$gt: 80}})
  • $gte 大于等于 (>=)
  1. { "_id" : 1, "hours" : 80, "tasks" : 7 }
  • $lt 小于 (<)
  1. > db.user.find({"hours": {$lt: 30}})
  • $lte 小于等于 (<=)
  1. { "_id" : 2, "hours" : 30, "tasks" : 9 }
  • $ne, 判断字段的值不等于(!=)
  1. db.user.find({"name":{"$ne":"Jack"}})

算术操作符

  • $mod,取模运算
  1. { "_id" : 1, "hours" : 80, "tasks" : 7 }
  2. { "_id" : 2, "hours" : 30, "tasks" : 9 }

使用聚合,采用$mod表达式来对 $hours$tasks进行运算

  1. db.user.aggregate([{$project: {fields: {$mod: ["$hours", "$tasks"]}}}])

聚合操作符

  • $addToSet,往数组中添加一个不重复的元素
  1. > db.user.update({name: 'Jack'}, {$addToSet: {"email": "abc@qq.com"}})
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  • $size,数组元素个数,查找email数组元素个数为2的数据结果集
  1. > db.user.find({email: {$size: 2}})
  2. { "_id" : ObjectId("5bd1a85eca656270cb3c1405"), "name" : "Jack", "email" : [ "aaa@qq.com", "abc@qq.com" ] }
  • $project 包含、排除、重命名和显示字段
  1. // 查询之前结构
  2. {
  3. "_id" : ObjectId("5bd83b5749fec9c2dc934aca"),
  4. "name" : "小B",
  5. "age" : 18,
  6. "idCard" : "410328200005201235",
  7. "_class" : "com.angelo.User",
  8. "contactor" : {
  9. "name" : "zhang",
  10. "age" : 18
  11. }
  12. }
  13. // 查询语句
  14. db.user.aggregate([
  15. {
  16. "$project":{
  17. "_id":0,
  18. "a":1,
  19. "contactorName":"$contactor.name",
  20. "contactorArray":[
  21. "$contactor.name",
  22. "$contactor.age",
  23. "$contactor.sex"
  24. ]
  25. }
  26. }
  27. ]);
  28. // 查询结果,如果指定的字段不存在则返回 null
  29. { "contactorName" : "zhang", "contactorArray" : [ "zhang", 18, null ] }
  • $unwind 展开数组元素

如果需要展开的字段不存在或者等于 null 和 [] 会被过滤掉,也可以使用 preserveNullAndEmptyArrays 字段告诉 unwind 不要过滤一些数据

  1. // 查询语句
  2. db.user.aggregate([
  3. {
  4. "$unwind":{
  5. "path": "$hobby",
  6. "includeArrayIndex": "habbyIndex", // 添加新字段展示展开的位置
  7. "preserveNullAndEmptyArrays": true // 需要展开的字段不存在或者等于 null 和 [] 不会在被过滤
  8. }
  9. }
  10. ]);
  11. // 查询结果
  12. { "_id" : ObjectId("5bd83b5749fec9c2dc934aca"), "name" : "小B", "age" : 18, "idCard" : "410328200005201235", "_class" : "com.angelo.User", "contactor" : { "name" : "zhang", "age" : 18 }, "hobby" : "篮球", "habbyIndex" : NumberLong(0) }
  13. { "_id" : ObjectId("5bd83b5749fec9c2dc934aca"), "name" : "小B", "age" : 18, "idCard" : "410328200005201235", "_class" : "com.angelo.User", "contactor" : { "name" : "zhang", "age" : 18 }, "hobby" : "足球", "habbyIndex" : NumberLong(1) }

高级查询操作符

  • $in,包含
  1. > db.user.find({name: {$in: ['Jack']}})
  2. { "_id" : ObjectId("5bd1a85eca656270cb3c1405"), "name" : "Jack", "email" : [ "aaa@qq.com", "abc@qq.com" ] }
  • $nin,在数组中不包含
  1. db.user.find({name: {$nin: ['Jack']}})
  • $exists,判断字段是否存在(true/false)
  1. db.user.find({"name":{"$exists": true}})
  • $all,匹配所有 {age: {"all": [7, 9]}} age数组中只要有7和9就满足条件。如果只有7,没有9则不符合条
  1. db.user.find({"name":{"$all":["Jack", "Tom"]}})

正则表达式

  • MongoDB 语法
  1. db.collection.aggregate({"$match":{"name": /hello/i}})
  • Nodejs 两种写法
    • collection.name = new RegExp('hello', 'i')
    • collection.name = {$regex: 'hello'}