zoukankan      html  css  js  c++  java
  • Mongo 基础命令

    插入

    db.collection.insert({"name": "iFan"})
    # 批量插入
    db.collection.insertMany([
        {"name": "iFan2"}, {"name": "iFan1"}
    ])
    

    mongodb能接受的最大消息长度为48M,如果当前的数据长度超过了48M,多数驱动程序会将该批量插入拆分为多个48M的请求。

    如果在批量插入时,一个文档插入失败,则之前的文档是会插入成功的,但是之后的文档不会在进行插入了,可以使用continueOnError忽略错误。

    删除

    db.collection.drop() // 删除所有文档
    db.collection.remove()
    db.collection.deleteOne() 
    db.collection.deleteMany() 
    

    更新

    db.collection.update({查询条件}, {需要替换的数据}) // 对于符合条件的文档,整个替换
    db.collection.update({查询条件}, {"$set": {需要更新的字段}}) // 对于符合条件的文档,原始文档中字段存在的则更新,不存在则添加
    db.collection.update({查询条件}, {"$unset": {需要删除的字段}}) // 删除字段
    db.collection.update({查询条件}, {"$inc": {"cnt": 1}}) // 对cnt字段进行+1, 如果不存在则创建
    db.collection.update({查询条件}, {"$push": {"key": "value"}}) // 对key数组进行添加
    db.collection.update({查询条件}, {"$push": {"key": {"$ne": "value"}}}) // 如果key数组中不存在value,则添加
    db.collection.update({查询条件}, {"$push": {"key": {"$each": [添加多个元素], "$slice": -10}}}) // $each 可以一次性添加多个元素,$slice只保留最后添加的10个元素。
    db.collection.update({查询条件}, {"$addToSet": {"key": "value"}}) // 保证添加的数据不会重复
    db.collection.update({查询条件}, {"$pop": {"key": -1}}) // 从头部删除
    db.collection.update({查询条件}, {"$pull": {"key": "条件"}}) // 根据条件删除
    db.collection.update({查询条件}, {修改信息}, true) // 没有找到符合条件的文档,则将条件和更新文档为基础创建一个新文档
    db.collection.updateMany()
    

    当执行更新操作增加的文档大小超过了该文档分配的空间,更新操作会在磁盘上重定位该文档。

    Mongodb不得不移动一个文档时,它会修改集合中的填充因子,填充因子是Mongodb为每个新文档预留的增长空间,使用db.coll.stats()查询。

    查询

    db.collection.find({查询条件}, {需要显示的字段})
    db.collection.find({"name": {"$in": ['a', 'b']}}) // 一个键对应多个值
    db.collection.find({"name": {"$nin": ['a', 'b']}}) // 不存在
    db.collection.find({"name": {"$ne": "a"}}) // 不等于
    db.collection.find({"$or": [{"name": "a"}, {"age": 18}]}) // OR
    db.collection.find({"name": {"friend": null, "$exists": true}}) // 判断 name的friend是否存在并且是否为null
    db.collection.find().count()
    db.collection.count() // 查询集合的长度
    db.collection.find({"age": {"$lt": 10}})   // age < 10
    db.collection.find({"age": {"$lte": 10}})  // age <= 10
    db.collection.find({"age": {"$gt": 10}})   // age > 10
    db.collection.find({"age": {"$gte": 10}})  // age >= 10
    db.collection.find({"age": {"$ne": 10}})   // age != 10
    

    查询数组

    db.collection.insert({"friend": ["a", "b", "c"]}) // 插入数组
    db.collection.find({"friend": "a"}) // 存在a
    db.collection.find({"friend": ["a", "b"]}) // 精确匹配。顺序,内容全部一致。
    db.collection.find({"friend": {"$all": ["a", "b"]}}) // 既有a,也有b
    db.collection.find({"friend": {"$size": 3}}) // 指定长度的数组。
    db.collection.find({}, {"firend": {"$slice": -10}}) // 返回后10个
    db.collection.find({}, {"firend": {"$slice": [10, 20]}}) // 返回第10到第20个,除非特别声明,否则使用 $slice 时将返回文档中的所有键。
    db.collection.find({}, {"friend.$": 1}) // 返回朋友中的第1个人
    

    查询内嵌文档

    db.collection.find({"name.first": "i", "name.last": "Fan"}) // 查询内嵌文档。
    db.collection.find({"name": {"$elemMatch": {"first": "i", "last": "Fan"}}}) // 在查询条件中部分指定匹配数组中的单个内嵌文档。
    

    使用正则查询

    db.collection.find({"name": /iFan/i}) // 使用正则表达式判断
    // Mongodb使用Perl兼容的正则表达式库来匹配正则表达式
    // mongodb可以为前缀表型正则表达式创建索引 `/^iFan/`,所以这类搜索会比较高效。
    

    限制显示字段

    db.collection_name.find({}, {key: 1, key2: 0}) // 查询字段:1->显示;0->不显示
    

    分页和排序

    db.collection.find().limit(number) // 限制显示条数
    db.collection.find().limit(number).skip(number) //跳过文档
    db.collection.find().sort({key:1, key2: 0}) // 根据key1升序,key2降序
    

    Aggregate

    • 使用Mongodb内置的原生操作,聚合效率非常高类似于SQL Group By 操作。
    • 每个阶段管道限制为100MB的内存
    SQL Mongodb
    where $match
    group by $group
    having $match
    selet $project
    order by $sort
    limit $limit
    sum() $sum
    count() $sum
    join $lookup
    db.collection.aggregate(pipeline<array>, options<document>)
    
    1. 查询记录条数
    db.collection.aggregate({
    	$group : {
    		_id: null,
    		count: {$sum: 1}
    	}
    })
    // Sql
    select count(*) as count from table;
    
    1. 查询某个字段之和
    db.collection.aggregate({
    	$group : {
    		_id: null,
    		count: {$sum: "$age"}
    	}
    })
    // Sql
    select sum(age) as count from table;
    
    1. 以某个字段为键,求和
    db.collection.aggregate({
    	$group : {
    		_id: "$sex",
    		count: {$sum: "$age"}
    	}
    })
    // Sql
    select sex, sum(age) as count from table group by sex;
    
    1. 多个字段为键,进行求和
    db.collection.aggregate({
        $group: {
            _id: {
                crawl_name: "$crawl_name",
                get_date: "$get_date"
            },
            count: {
                $sum: 1
            }
        }
    })
    // sql
    select crawl_name, get_date, count(*) from table group by crawl_name, get_date;
    
    1. 对聚合的字段进行过滤
    db.collection.aggregate([{
        $match: {
            get_date: {
                $gte: 20200701
            }
        }
    }, {
        $group: {
            _id: {
                crawl_name: "$crawl_name",
                get_date: "$get_date"
            },
            count: {
                $sum: 1
            }
        }
    }, {
        $match: {
            count: {
                $gte: 10
            }
        }
    }])
    // sql
    select crawl_name, get_date, count(*) 
    from table 
    where get_date >= 20200701
    group by crawl_name, get_date
    having count(*) > 10;
    

    MapReduce

    var map = function() {
            emit(this.crawl_name, { count: 1 });
    }
    
    var reduce = function(key, emits) {
        total = 0
        for (var i in emits) {
            total += emits[i].count;
        }
        return {
            "count": total
        };
    }
    
    mr = db.runCommand({
        "mapreduce": "collection",
        "map": map,
        "reduce": reduce,
    	"out": {inline: 1}
    })
    
    
  • 相关阅读:
    Masterha-manager避免自动关闭的方法
    MHA自动切换流程
    vue 使用keep-alive缓存tab切换组件,保持每个组件滚动条位置
    el-select 输入下拉搜索,匹配不到数据时也保留输入值,同时input获取焦点时保留其value值
    尝试 React16、React-router4 实现根据动态菜单生成按需加载的路由
    vue iscroll5滚动条组件
    vue项目中 axios请求拦截器与取消pending请求功能
    jquery编写的简单日历
    手机访问电脑wampServer本地环境页面
    ajax在ie下返回未定义解决方案
  • 原文地址:https://www.cnblogs.com/iFanLiwei/p/12846556.html
Copyright © 2011-2022 走看看