博客

#mongodb服务

1.先无权限启动数据库                   /usr/local/mongodb/bin/mongod   --dbpath=/data/db --fork --logpath=/data/db/mongodb.log
2.进入数据库                           use admin
3.创建角色                             db.createRole({role:'sysadmin',roles:[],privileges:[{resource:{anyResource:true},actions:['anyAction']}]})
4.在admin中创建超级管理员              db.createUser({user:'admin',pwd:'password123',roles:[{role:'sysadmin',db:'admin'}]})
5.在主数据库下关闭数据库               db.shutdownServer();
6.有权限启动数据库                     /usr/local/mongodb/bin/mongod  --auth --dbpath=/data/db --fork --logpath=/data/db/mongodb.log
/usr/local/mongodb/bin/mongod --auth --dbpath=/data/db --fork --logpath=/data/db/mongodb.log --storageEngine wiredTiger --journal --maxConns=50000 --bind_ip 0.0.0.0

创建数据集合                           use newdb
创建普通管理员                         db.createUser({user:'userName',pwd:'password123',roles:[{role:'readWrite',db:'admin'}]});
登陆数据集合                           db.auth("userName","password123");

把指定的数据库备份到指定目录            ./mongodump -u lzt -p dgxkkg -h 127.0.0.1:27017 -d lwx -o /data/dump

#mongdob 聚合查询


     var MongoClient = require('mongodb').MongoClient;
     var urla = 'mongodb://x:xxxxxx@127.0.0.1:27017/x';
     MongoClient.connect(urla,async function(err, client) {
         if(err){console.error(err);return false;}
         var a=client.collection('bbb');
         await a.remove();
         await a.insertOne({
             'name':"dd",
             array:[{name:"11"}, {name:"12"}, {name:"13"}],
             array2:[{id:"11"}, {id:"12"}, {id:"13"}]
         });

         var find=await a.find({}).toArray();
         console.log(JSON.stringify(find));
        var finda=await a.aggregate([
            {"$unwind":"$array"}, //将存在指定数组字段的数据拆分成多条
            {"$unwind":"$array2"},
            {"$match":{"array.name":"11","name":"dd"}},
            {"$project":{"array":1}}
            ]).toArray();
         console.log("finda",JSON.stringify(finda));

         /*
         打印的内容
         [{"_id":"5c3849e7c89f764a1494c190","name":"dd","array":[{"name":"11"},{"name":"12"},{"name":"13"}],"array2":[{"id":"11"},{"id":"12"},{"id":"13"}]}]
         finda [{"_id":"5c3849e7c89f764a1494c190","array":{"name":"11"}},{"_id":"5c3849e7c89f764a1494c190","array":{"name":"11"}},{"_id":"5c3849e7c89f764a1494c190","array":{"name":"11"}}]

         */
     });

   

表达式 描述 实例
$sum 计算总和。 db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}])
$avg 计算平均值 db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}])
$min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$min : “$likes”}}}])
$max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$max : “$likes”}}}])
$pus 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$push: “$url”}}}])
$addToSet 在结果文档中插入值到一个数组中,但不创建副本。 db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$addToSet : “$url”}}}])
$first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{$group : {_id : “$by_user”, first_url : {$first : “$url”}}}])
$last 根据资源文档的排序获取最后一个文档数据。 db.mycol.aggregate([{$group : {_id : “$by_user”, last_url : {$last : “$url”}}}])

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:

$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
var listCollections={"name":{$in:["test","test2"]}};//限制哪个表
var isA=await client.listCollections(listCollections).toArray();  查询所有表的名称和信息
update 返回的部分对象取值  {result:{n:10,nModified:0,ok:1}}
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。

$ne不等于
(>) 大于 - $gt
(<) 小于 - $lt
(>=) 大于等于 - $gte
(<= ) 小于等于 - $lte

Comparison
名称 描述
$eq    匹配等于指定值的值。
$gt    匹配大于指定值的值。
$gte    匹配大于或等于指定值的值。
$in    匹配数组中指定的任何值。
$lt    匹配小于指定值的值。
$lte    匹配小于或等于指定值的值。
$ne    匹配所有不等于指定值的值。
$nin    不匹配数组中指定的任何值。


Logical
名称    描述
$and    使用逻辑连接查询子句AND将返回与两个子句的条件匹配的所有文档。
$not    反转查询表达式的效果并返回与查询表达式不匹配的文档。
$nor    使用逻辑连接查询子句NOR将返回所有无法匹配两个子句的文档。
$or    使用逻辑连接查询子句OR将返回与任一子句的条件匹配的所有文档。


Element
名称    描述
$exists    匹配具有指定字段的文档。
$type    如果字段是指定类型,则选择文档。


Evaluation
名称    描述
$expr    允许在查询语言中使用聚合表达式。
$jsonSchema    根据给定的JSON模式验证文档。
$mod    对字段的值执行模运算,并选择具有指定结果的文档。
$regex    选择值与指定正则表达式匹配的文档。
$text    执行文本搜索。
$where    匹配满足JavaScript表达式的文档。


//mongodb , 批量操作

db.getCollection("a123").bulkWrite([

    {insertOne:{a:1}}

    {updateMany:{filter:{a:1},update:{$set:{a:11}},upsert:1}},
    {updateMany:{filter:{a:2},update:{$set:{a:111}},upsert:1}},
])

bulkArr.push({updateMany:{filter:filterData,update:{$set:updateData},upsert:true}});
await db_allStatisticsCount.bulkWrite(bulkArr);




{ mongodb{$exists:false}}   //字段是否存在
db.getCollection("ykx_Configuration").find({payFor:{$exists:false}})




db.getCollection("ykx_OutboundContainerLog").aggregate([

    { $group: { _id : {

                containerNumber:"$containerNumber",
                missionCode:"$missionCode",
            }, count: { $sum : 1 } } },
    { $match: { count: { $gt : 1} } },
    {"$project": {
            _id:0,
            containerNumber:"$_id.containerNumber",
            missionCode:"$_id.missionCode",
            travelTaskNumber:1,
            loadingTaskNumber:1,

        } },

])




db.getCollection("mission").aggregate([
    {$match:{createTime:{$gt:1601481600000,$lt:1604160000000}}},
    { $group: { _id : {route:"$route"}, count: { $sum : 1 } } },
    {"$project": {
            _id:0,
            route:"$_id.route",

        } },
])

//聚合去重
db.getCollection("ykx_clientAddress").aggregate([
//{$match:{route:{$in:["西堤"]}}},
    { $group: { _id : {addressCode:"$addressCode"}, count: { $sum : 1 } } },
    { $match: { count: { $gt : 1} } },
    {"$project": {
            _id:0,
            addressCode:"$_id.addressCode"
        } },
])


//find查询时需要 {projection:{}} 对象
let  aa=await obj1.find({_id:{$in:newArr},state: {$ne:"0"}},{projection:{_id:1,orderCode:1,state:1}}).toArray();