mongo 常用查询

一: 对比

等于: $eq    例如: {'age':{'$eq':20}}

不等于: $ne    例如: {'age':{'$ne':20}}

大于: $gt   例如: {'age':{'$gt':20}}

大于等于: $gte   例如: {'age':{'$gte':20}}

在。。里: $in  例如: {'age':{'$in':[20,30]}}

不在。。里: $nin  例如: {'age':{'$nin':[20,30]}}

小于: $lt    例如: {'age':{'$lt':20}}

小于等于: $lte   例如: {'age':{'$lte':20}}

二:逻辑查询

并且: $and    例如:{ ‘$and’: [ { ‘price’: { ‘$ne’: 1.99 } }, { ‘price’: { ‘$exists’: true } } ]

或者: $or    例如: { '$or': [ { 'quantity': { '$lt': 20 } }, { 'price': 10 } ] }

取反:$not    例如:{ 'price': {'$not': { '$gt': 1.99 } } }

多条件取反(既不也不,用法类似and):$nor  例如:{ '$nor': [ { 'price': 1.99 }, { 'sale': true } ] }

三:属性是否存在、类型过滤

属性是否存在: $exists  例如:{ ‘qty’: { ‘$exists’: true, ‘$nin’: [ 5, 15 ] } }

类型判断:$type  例如: { field: { $type: } }

使用nummer和Aloas都可以

mongo 常用查询_第1张图片mongo 常用查询_第2张图片

四:模糊查询

(version>3.6)条件语句:$expr   例如: { $expr: { $gt: [ "$spent" , "$budget" ] } }     查询spent大于budget的

let discountedPrice = {
   $cond: {
      if: { $gte: ["$qty", 100] },
      then: { $multiply: ["$price", NumberDecimal("0.50")] },
      else: { $multiply: ["$price", NumberDecimal("0.75")] }
   }
};

// Query the supplies collection using the aggregation expression

db.supplies.find( { $expr: { $lt:[ discountedPrice,  NumberDecimal("5") ] } });
(version>3.6)json格式查询条件:$jsonSchema 例如: {$jsonSchema:myjsonschema}
定义查询块:
let myjsonschema =  {
      required: [ "item", "qty", "instock" ],
      properties: {
         item: { bsonType: "string" },
         qty: { bsonType: "int" },
         size: {
            bsonType: "object",
            required: [ "uom" ],
            properties: {
               uom: { bsonType: "string" },
               h: { bsonType: "double" },
               w: { bsonType: "double" }
            }
          },
          instock: { bsonType: "bool" }
      }
 }

除法判断$mod  例如: { 'qty': { '$mod': [ 4, 0 ] } }  查询qty除以4余0的

正则表达式:$regex   例如:{ name: { $regex: /acme.*corp/i, $nin: [ 'acmeblahcorp' ] } } 或者

{ name: { $regex: /acme.*corp/, $options: 'i', $nin: [ 'acmeblahcorp' ] } }

options参数: 'i':不区分大小写;'m':每行的开头和结尾都要匹配;'x':忽略空白字符;’s‘:允许点匹配所有

文本搜索(必须创建文本索引才可以使用):$text  例如 : 

{
  $text:
    {
      $search: ,
      $language: ,
      $caseSensitive: ,
      $diacriticSensitive: 
    }
}

执行javascript函数: $where  例如:

{ $where: function() {
   return (hex_md5(this.name) == "9b53e667f30cd329dca1ec9e6a83e994")
} } 

五:数组

包含给出的所有对象 : $all   例如:{ tags: { $all: [ [ "ssl", "security" ] ] } }  ,查询tags字段包含’ssl‘,’security‘的集合

至少有一个满足条件的元素存在:$elemMatch  例如:{ results: { $elemMatch: { $gte: 80, $lt: 85 } } ,查询results属性至少包含一个大于等于80小于85的元素

数组元素个数过滤:$size  例如: { field: { $size: 1 } }

array.$  标识匹配条件的第一个: 

例如:

db.students.find( { semester: 1, grades: { $gte: 85 } },
                  { "grades.$": 1 } )

$meta  元数据

{ $meta:  }   metaDataKeyword取值:textScore,searchScore,searchHighlights  

$slice  切片  例如:

db.posts.find( {}, { comments: { $slice: -5 } } )  查询最后5条数据
db.posts.find( {}, { comments: { $slice: [ 20, 10 ] } } )  从第20条数据开始,查询10条数据
db.posts.find( {}, { comments: { $slice: [ -20, 10 ] } } )  从尾部数第20开始,查询10条数据

六:更新字段

$currentDate   修改字段为当前时间

db.customers.updateOne(
   { _id: 1 },
   {
     $currentDate: {
        lastModified: true,  # 将lastModified改为当前时间
        "cancellation.date": { $type: "timestamp" } #cancellation.date改为当前时间戳
     },
     $set: {
        "cancellation.reason": "user request",
        status: "D"
     }
   }
)

$inc  自增 例如:

b.products.update(
   { sku: "abc123" },
   { $inc: { quantity: -2, "metrics.orders": 1 } }
)

$min   将高于目标值的全部转为目标值 例如:

db.scores.updateMany( { _id: 1 }, { $min: { lowScore: 150 } } )

$max  将低于目标值的全部转为目标值 例如:

db.scores.updateMany( { _id: 1 }, { $max: { lowScore: 150 } } )

$mul   属性相乘 例如:

db.products.update(
   { _id: 1 },
   { $mul: { price: NumberDecimal("1.25"), qty: 2 } }
)

$rename 属性重命名 例如:

db.students.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' }

$set 修改属性值

$setOnInsert  插入时添加属性:如果新插入了一条数据,则添加setOnInsert的值,否则仅执行set

db.products.update(
  { _id: 1 },
  {
     $set: { item: "apple" },
     $setOnInsert: { defaultQty: 100 }
  },
  { upsert: true }
)

$unset 删除属性 例如:

db.products.update(
   { sku: "unknown" },
   { $unset: { quantity: "", instock: "" } }
)

七:数组更新

表示第一个匹配对象

$[] 表示所有匹配对象

$[element]  与arraryFilters配合使用 例如:

db.collection.update(
   { myArray: [ 0, 1 ] },
   { $set: { "myArray.$[element]": 2 } },
   { arrayFilters: [ { element: 0 } ],
     upsert: true }
)  # 将数组中的0全部改为2
db.students2.update(
   { },
   { $set: { "grades.$[elem].mean" : 100 } },
   {
     multi: true,
     arrayFilters: [ { "elem.grade": { $gte: 85 } } ]
   }
) # 将数组中对象grade大于等于85的对象的mean值改为100

$addToSet  不存在则添加

例如:

db.test.update(
   { _id: 1 },
   { $addToSet: { letters: [ "c", "d" ] } }
)
$pop 移除第一个(-1)或最后一个元素(-1)

例如:

{ $pop: { : <-1 | 1>, ... } }

$pull  移除所有匹配的元素

例如:移除水果列表中的’apples,和oranges ,移除vegetables中carrots

db.stores.update(
    { },
    { $pull: { fruits: { $in: [ "apples", "oranges" ] }, vegetables: "carrots" } },
    { multi: true }
)

$push   添加元素,单个或多个

例如:

db.students.update(
   { _id: 5 },
   {
     $push: {
       quizzes: {
          $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
          $sort: { score: -1 },  # 按照score倒序排列
          $slice: 3  # 截取三个元素
       }
     }
   }
)

$pullAll 移除所有给出的元素

  例如: 移除scores中的0和5

db.survey.update( { _id: 1 }, { $pullAll: { scores: [ 0, 5 ] } } )

$each   与 push和addToSet搭配使用,操作多个元素

$position   指定push是的添加元素位置

$slice     与push  each联合使用

$sort  与push  each联合使用

 

八:聚合操作

limit:  截取 limit(20)

skip :分页时跳过skip(20)

sort : {‘age':1}  升序  ,{age:-1}降序 

你可能感兴趣的:(mongo 常用查询)