虚位以待(AD)
虚位以待(AD)
首页 > 数据库 > MongoDB数据库 > MongoDB关键点集锦

MongoDB关键点集锦
类别:MongoDB数据库   作者:码皇   来源:<a href="http://blog.csdn.net/real_bird" target="_blank" rel="nofollow&q   点击:

MongoDB关键点集锦。1、MongoError: server instance in invalid state undefined。

1、MongoError: server instance in invalid state undefined

参考segmentfault的一个解答

看起来你用的是node-mongodb-native驱动。老版本确实有使用过DB作为顶级对象,不过现在的驱动通常建议把MongoClient用为顶级对象使用。直接参考驱动文档:
https://github.com/mongodb/node-mongodb-native#connecting-to-mongodb
注意MongoClient维护着连接池,所以通常当你的应用退出前都可以不要关闭,保留一个单例的MongoClient一直用就可以了。

我按照这个建议后,确实修复了这个问题。修改后的代码如下(关键代码):

    // 使用mongoClient作为顶级对象,而不是require('
    mongodb'
    )var mongodbClient = require('
    mongodb'
    ).MongoClient;
    // 连接数据库取代了db.open(...)mongodbClient.connect(url, function(err, db) {
    if(err) {
    return callback(err);
    }
    var collection = db.collection('
    posts'
    );
    collection.insertOne(post, function(err) {
    if(err) {
    return callback(err);
    }
    callback(null);
    db.close();
    }
    ) }
    )

通过collection操作数据库的方法。我打印了collection.__proto__,如下所示:

    {
    collectionName: [Getter], namespace: [Getter], readConcern: [Getter], writeConcern: [Getter], hint: [Getter/Setter], find: [Function], insertOne: [Function], insertMany: [Function], bulkWrite: [Function], insert: [Function], updateOne: [Function], replaceOne: [Function], updateMany: [Function], update: [Function], deleteOne: [Function], removeOne: [Function], deleteMany: [Function], removeMany: [Function], remove: [Function], save: [Function], findOne: [Function], rename: [Function], drop: [Function], options: [Function], isCapped: [Function], createIndex: [Function], createIndexes: [Function], dropIndex: [Function], dropIndexes: [Function], dropAllIndexes: [Function], reIndex: [Function], listIndexes: [Function], ensureIndex: [Function], indexExists: [Function], indexInformation: [Function], count: [Function], distinct: [Function], indexes: [Function], stats: [Function], findOneAndDelete: [Function], findOneAndReplace: [Function], findOneAndUpdate: [Function], findAndModify: [Function], findAndRemove: [Function], aggregate: [Function], parallelCollectionScan: [Function], geoNear: [Function], geoHaystackSearch: [Function], group: [Function], mapReduce: [Function], initializeUnorderedBulkOp: [Function], initializeOrderedBulkOp: [Function] }

2、mongodb更新一个数组,如commets是一个数组,添加comment

    collection.update({
    "name": name,}
    , {
    $push: {
    "comments": comment}
    }
    )

3、distinct(key, query, options, callback){Promise}

查询集合返回一个带有key键的值组成的列表,列表的值是不重复的。其中每个集合需要满足query条件。

    var MongoClient = require('
    mongodb'
    ).MongoClient, test = require('
    assert'
    );
    MongoClient.connect('
    mongodb://localhost:27017/test'
    , function(err, db) {
    // 创建集合 var collection = db.collection('
    distinctExample2'
    );
    // 插入多个文档 collection.insertMany([{
    a:0, b:{
    c:'
    a'
    }
    }
    , {
    a:1, b:{
    c:'
    b'
    }
    }
    , {
    a:1, b:{
    c:'
    c'
    }
    }
    , {
    a:2, b:{
    c:'
    a'
    }
    }
    , {
    a:3}
    , {
    a:3}
    , {
    a:5, c:1}
    ], {
    w:1}
    , function(err, ids) {
    // 返回含有c是1的集合的a属性的值组成的列表。 [5] collection.distinct('
    a'
    , {
    c:1}
    , function(err, docs) {
    test.deepEqual([5], docs.sort());
    db.close();
    }
    );
    }
    )}
    );

4、查询所有tags中包含tag的文档。tags是数组 [‘a’, ‘b’, ‘c’]的形式

    collection.find({
    tags: '
    a'
    }
    ) // 这样也可以查询到这个集合

5、使用$inc增加某个字段

    // 查询到这个文档,将`pv`字段加1,如果不存在`pv`字段,则创建pv字段,初始值为0,并加1collection.updateOne({
    "name": name, "time.day": day, "title": title}
    , {
    $inc: {
    "pv": 1}
    }
    , function(err) {
    if(err) {
    return callback(err);
    }
    db.close();
    }
    )

6、mongodb分页,主要用到count和skip和limit属性

    Post.getTen = function(name, page, callback) {
    mongodbClient.connect(url, function(err, db) {
    if(err) {
    return callback(err) }
    var collection = db.collection('
    posts'
    );
    var query = {
    }
    ;
    if(name) {
    query.name = name;
    }
    // 对于一个query对象,首先使用`count()`来查询到总数目,结果值赋给参数`total`,比如`total`是93,然后使用`find()`查询,并跳过(page-1)*10个结果,返回之后的10个结果,按时间(`time`)降序排序。1是升序,也是默认的。-1是降序 collection.count(query, function(err, total) {
    collection.find(query).skip((page - 1) * 10).limit(10).sort({
    time: -1 }
    ).toArray(function(err, docs) {
    if(err) {
    return callback(err);
    }
    callback(null, docs, total);
    db.close();
    }
    ) }
    ) }
    )}
相关热词搜索: