• 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 即新元素覆盖了旧元素
    
  • 相关阅读:
    leetcode 之Binary Tree Postorder Traversal
    关于java中this的一些总结
    Javascript的匿名函数与自执行
    js 闭包学习笔记
    滚动条到底自动加载数据
    AMD:异步模块定义
    Sass、LESS 和 Stylus
    【原创】Mysql设置自增长主键的初始值
    -webkit-animation的使用
    CSS滤镜
  • 原文地址:https://www.cnblogs.com/lovecc/p/6022623.html
Copyright © 2020-2023  润新知