zoukankan      html  css  js  c++  java
  • Nodejs中Mongodb的基本使用

    Node.js的Mongodb使用

    安装mongodb模块 npm install --save mongodb

    数据库连接

    var MongoClient = require('mongodb').MongoClient;
    var assert = require('assert');
    
    //连接test数据库
    var url = 'mongodb://localhost:27017/test';
    MongoClient.connect(url, (err,db) => {
        assert.equal(null,err);
        console.log('连接成功');
        db.close();
    });
    

    插入数据

    插入一个文档对象

    var MongoClient = require('mongodb').MongoClient;
    var assert = require('assert');
    
    //test数据库的路径
    var url = 'mongodb://localhost:27017/test';
    
    //插入文档
    var insertDocument = (db,callback) => {
        //在test库下blog集合中 新增json文档
        db.collection('blog').insertOne({
            name:"xiaos",
            age:22
        }, (err, result) => {
            assert.equal(err,null);
            console.log('新增文档成功');
            callback();
        });
    };
    
    //插入操作
    MongoClient.connect(url, (err,db) => {
        assert.equal(null,err);
        insertDocument(db, ()=>{
            db.close();
        });
    });
    

    批量插入操作:insertMany(doc,options,callback)(如果没有callback函数,本身返回一个Promise对象)

    简单的insertMany操作

    var MongoClient = require('mongodb').MongoClient,
        test = require('assert');
    
    MongoClient.connect('mongodb://localhost:27017/test',(err, db) => {
        var blog = db.collection('blog');
        //新增两个文档对象
        blog.insertMany([{name:"shen"},{name:"fzq"}],(err,r) => {
            test.equal(null,err);
            //回调函数中返回的r为执行完插入操作的对象,insertedCount属性为已经插入的对象个数
            test.equal(2,r.insertedCount);
            db.close();
        });
    });    
    

    使用Promise的批量插入操作!

    var MongoClient = require('mongodb').MongoClient,
        test = require('assert');
    MongoClient.connect('mongodb://localhost:27017/test', (err,db) => {
        var blog = db.collection('blog');
        blog.insertMany([{name:"xiaosGG"},{name:"fzqDD"}]).then((r) => {
            test.equal(2,r.insertedCount);
            db.close();
        });
    });
    

    因为mongodb和nodejs都是异步io的机制,所有几乎所有耗时的操作都是以回调函数的方式完成。但是因为回调函数的层次嵌套,一段代码后面可能会跟上一大段的 });,随着层级的增加,代码变得不易理解和维护。所有在使用MongoDB时,推荐用Promise的方式来解决回调嵌套的问题。
    从上面的代码可以看出,insertMany([obj...])返回一个Promise对象,我们用.then((r)=>{})接收正常的回调值,用.catch((err) => {})来抓取异常。

    使用生成器(Generator)的批量插入操作

    var MongoClient = require('mongodb').MongoClient,
        test = require('assert'),
        co = require('co');
        
    co(function*(){
        var db = yield MongoClient.connect('mongodb://localhost:27017/test');
        var blog = db.collection('blog');
        var r = yield blog.insertMany([{name:"xiaosBB"},{name:"fzqMM"}]);
        test.equal(2,r.insertedCount);
        db.close();
    });
    

    单个文档插入:insertOne(doc,options,callback)(如果没有callback函数,本身返回一个Promise对象)

    简单的插入操作

    var MongoClient = require('mongodb').MongoClient,
        test = require('assert');
    MongoClient.connect('mongodb://localhost:27017/test',(err,db)=>{
        var blog = db.collection('blog');
        blog.insertOne({name:"xiaos"},(err,r) => {
            test.equal(null,err);
            test.equal(1,r.insertedCount);
            db.close();
        });
    });
    

    使用Promise的插入操作

    var MongoClient = require('mongodb').MongoClient,
        test = require('assert');
    MongoClient.connect('mongodb://localhost:27017/test',(err,db)=>{
        var blog = db.collection('blog');
        blog.insertOne({name:"xiaos"}).then((r)=>{
            test.equal(1,r.insertedCount);
            db.close();
        });
    });
    

    使用生成器的插入操作

    var MongoClient = require('mongodb').MongoClient,
        test = require('assert'),
        co = require('co');
        
    co(function*(){
        var db = yield MongoClient.connect('mongodb://localhost:27017/test');
        var blog = db.collection('blog');
        var r = yield blog.insertOne({name:"xiaosBB"});
        test.equal(1,r.insertedCount);
        db.close();
    });
    

    mapReduce(map,reduce,options,callback) return Promise if no callback

    var MongoClient = require('mongodb').MongoClient,
        test = require('assert');
    
    MongoClient.connect()
    

    isCapped(callback) return Promise if no callback

    var MongoClient = require('mongodb').MongoClient,
        test = require('assert');
    MongoClient.connect('mongodb://localhost:27017/test',(err,db) => {
        db.createCollection('newBlog',{'capped':true,'size':1024},(err,collection) => {
            test.equal('newBlog',collection.collectionName);        
            collection.isCapped((err,capped) => {
                test.equal(true,capped);
                db.close();
            });
        });
    });
    

    capped collection是指固定大小的集合,新元素插入后会覆盖掉旧的元素,保持整个集合的大小不变。

    //在命令行中输入mongo
    //创建一个1024大小的myCappedCollection集合
    db.createCollection('myCappedCollection',{'capped':true,'size':1024});
    //插入1000条记录
    for (var i = 1;i <= 1000;i++){
        db.myCappedCollection.save({id:i,name:'xiaos'+i});
    }
    //查询文档个数
    db.myCappedCollection.count()
    //实际只有18个文档id为983-1000 即新元素覆盖了旧元素
    
  • 相关阅读:
    C++笔记
    mongodb文件损坏的恢复--无可恢复数据
    wiredtiger--初学数据恢复
    mongodb异常恢复
    守护进程,互斥锁, IPC ,Queue队列,生产消费着模型
    进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程
    socket之UDP协议,并发编程介绍,操作系统发展史
    半连接数,粘包问题,自定义报头
    socket模块
    网络编程介绍,C/S 架构,网络通讯协议,osi七层
  • 原文地址:https://www.cnblogs.com/lovecc/p/6022623.html
Copyright © 2011-2022 走看看