操作符

MongoDB 操作符

管道操作符

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

比较类型操作符

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

算术操作符

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

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

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

聚合操作符

  • $addToSet,往数组中添加一个不重复的元素
> db.user.update({name: 'Jack'}, {$addToSet: {"email": "abc@qq.com"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  • $size,数组元素个数,查找email数组元素个数为2的数据结果集
> db.user.find({email: {$size: 2}})
{ "_id" : ObjectId("5bd1a85eca656270cb3c1405"), "name" : "Jack", "email" : [ "aaa@qq.com", "abc@qq.com" ] }
  • $project 包含、排除、重命名和显示字段
// 查询之前结构
{
    "_id" : ObjectId("5bd83b5749fec9c2dc934aca"),
    "name" : "小B",
    "age" : 18,
    "idCard" : "410328200005201235",
    "_class" : "com.angelo.User",
    "contactor" : {
        "name" : "zhang",
        "age" : 18
    }
}

// 查询语句
db.user.aggregate([
    {
        "$project":{
            "_id":0,
            "a":1,
            "contactorName":"$contactor.name",
            "contactorArray":[
                "$contactor.name",
                "$contactor.age",
                "$contactor.sex"
            ]
        }
    }
]);

// 查询结果,如果指定的字段不存在则返回 null
{ "contactorName" : "zhang", "contactorArray" : [ "zhang", 18, null ] }
  • $unwind 展开数组元素

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

// 查询语句
db.user.aggregate([
    {
        "$unwind":{
            "path": "$hobby",
            "includeArrayIndex": "habbyIndex", // 添加新字段展示展开的位置
            "preserveNullAndEmptyArrays": true // 需要展开的字段不存在或者等于 null 和 [] 不会在被过滤
        }
    }
]);

// 查询结果

{ "_id" : ObjectId("5bd83b5749fec9c2dc934aca"), "name" : "小B", "age" : 18, "idCard" : "410328200005201235", "_class" : "com.angelo.User", "contactor" : { "name" : "zhang", "age" : 18 }, "hobby" : "篮球", "habbyIndex" : NumberLong(0) }
{ "_id" : ObjectId("5bd83b5749fec9c2dc934aca"), "name" : "小B", "age" : 18, "idCard" : "410328200005201235", "_class" : "com.angelo.User", "contactor" : { "name" : "zhang", "age" : 18 }, "hobby" : "足球", "habbyIndex" : NumberLong(1) }

高级查询操作符

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

正则表达式

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