mongodb 常用操作

#备份
mongodump.exe -h 127.0.0.1:27017 -d medicine -c jddj -o C:\MongoDB\Server\4.2\backup
#恢复
mongorestore.exe -h 127.0.0.1:27017 -d medicine -c jddj C:\MongoDB\Server\4.2\backup\medicine\jddj.bson

#导出json、csv数据

mongoexport.exe -h 127.0.0.1:27017 -d medicine -c jddj -o E:\爬虫项目\json\jddj.json
mongoexport.exe -h 127.0.0.1:27017 -d medicine -c jddj --type=csv -f 字段1,字段2,字段3 -o E:\爬虫项目\csv\jddj.csv

#导入json、csv数据

mongoexport.exe -h 127.0.0.1:27017 -d medicine -c jddj E:\爬虫项目\json\jddj.json
mongoimport.exe -h 127.0.0.1:27017 -d medicine -c jddj --type csv --headerline --file E:\爬虫项目\csv\jddj.csv

#日志分割

use admin
db.runCommand({logRotate:1})

#去重
#按照 名称、规格 聚合查询去重

db.jddj.aggregate(
    [ 
        //{$match:{type:1,action:3}}, //可以加条件给这里 匹配type=1 action=3 可选
        { //根据 名称、规格 分组,$group只会返回参与分组的字段,使用$addToSet在返回结果数组中增加_id字段)
            $group: { 
                _id: {名称: ‘$名称‘,规格: ‘$规格‘},
                count: {
                    $sum: 1
                },
                dups: {
                    $addToSet: ‘$_id‘
                }
            } 
        }, 
        { 
            $match: {
                count: { //(匹配数量大于1的数据
                    $gt: 1 
                }
            } 
        } 
    ],
        {allowDiskUse: true}
)
.forEach( //(使用forEach循环根据_id删除数据)
    function( doc ){ 
        doc.dups.shift(); 
        db.jddj.remove(
            {
                _id: {
                    $in: doc.dups
                }
            }
        ); 
    }
)

#模糊查询(查找key为“名称”,value包含“小儿热速清颗粒”的数据)

db.jddj.find({"名称":{$regex:"小儿热速清颗粒"}})

db.test_info.find({"name": {$regex: ‘测试‘, $options:‘i‘}})
    i 忽略大小写,{<field>:{$regex/pattern/i}},设置i选项后,模式中的字母会进行大小写不敏感匹配。
    m 多行匹配模式,{<field>:{$regex/pattern/,$options:‘m‘}},m选项会更改^和$元字符的默认行为,分别使用与行的开头和结尾匹配,而不是与输入字符串的开头和结尾匹配。
    x 忽略非转义的空白字符,{<field>:{$regex:/pattern/,$options:‘m‘}},设置x选项后,正则表达式中的非转义的空白字符将被忽略,同时井号(#)被解释为注释的开头注,只能显式位于option选项中。
    s 单行匹配模式{<field>:{$regex:/pattern/,$options:‘s‘}},设置s选项后,会改变模式中的点号(.)元字符的默认行为,它会匹配所有字符,包括换行符(\n),只能显式位于option选项中。

使用$regex操作符时,需要注意下面几个问题:
    i,m,x,s可以组合使用,例如:{name:{$regex:/j*k/,$options:"si"}}
    在设置索引的字段上进行正则匹配可以提高查询速度,而且当正则表达式使用的是前缀表达式时,查询速度会进一步提高,例如:{name:{$regex: /^joe/}

#查询重复
db.getCollection(‘jddj‘).aggregate([
    { $group: { _id : ‘$名称‘, count: { $sum : 1 } } },
    { $match: { count: { $gt : 1} } }
])

#查询存在、不存在某字段的数据

db.getCollection(‘jddj‘).find({"category1Id":{"$exists":true}})
db.getCollection(‘jddj‘).find({"category1Id":{"$exists":false}})

db.jddj.aggregate([
{$match: 
    {"category1Id":{"$exists":true}}
  },

])

db.jddj.aggregate([
{$match: 
    {"category1Id":{"$exists":false}}
  },

])

#聚合查询(多次match,并删除查询结果)

db.jddj.aggregate([
{$match: 
    {"名称":{$regex:"小儿热速清颗粒"}}
  },
{$match: 
    {规格:{$exists:false}} 
  },
{$group:
    {_id:null,
    dups: {$addToSet:‘$_id‘}
    }
  }
],
  {allowDiskUse: true}
)
.forEach( 
    function( doc ){ 
        db.jddj.remove(
            {
                _id: {
                    $in: doc.dups
                }
            }
        ); 
    }
)

#根据重复的 名称,去除不包含 规格 的数据

db.getCollection(‘jddj‘).aggregate([
    { $group: { _id : ‘$名称‘, count: { $sum : 1 } } },
    { $match: { count: { $gt : 1} } },
    { $group: { _id: null, dups1: {$addToSet:‘$_id‘}}
  }
])
.forEach( 
    function( doc1 ){ 
        db.getCollection(‘jddj‘).aggregate([
        { $match: { 名称: { $in : doc1.dups1} } },
        { $match: { 规格: { $exists: false}} },
        { $group:{ _id: null,dups: { $addToSet: ‘$_id‘}} }
        ])
        .forEach( 
    function( doc ){ 
        db.jddj.remove(
            {
                _id: {
                    $in: doc.dups
                }
            }
        ); 
    }
)
    }
)

#Mongodb查询结果插入新建表中

var result = db.原始表名.find({"查询条件"})
while(result.hasNext()) db.新建表名.insert(result.next())

mongodb 常用操作

上一篇:权限系统模型和常用权限框架


下一篇:MongoDB点赞和吐槽功能