<blockquote>什么是Mongoose?</blockquote>
<br/><a href=“https://github.com/LearnBoost/mongoose”>Mongoose</a>是基于<a href=“https://github.com/christkv/node-mongodb-native”>node-mongodb-native</a>开发的MongoDB nodejs驱动,可以在异步的环境下执行。
<br/><blockquote>
<br/><p style=“text-align: left;”>如何安装Mongoose?</p>
<br/></blockquote>
<br/><p style=“text-align: left;”><em>npm install mongoose</em></p>
<br/>
<br/><blockquote>如何使用Mongoose?</blockquote>
<br/><ul>
<br/> <li>test.js代码:</li>
<br/></ul>
<br/><pre escaped=“true” lang=“javascript” line=“1”>var mongoose = require(‘mongoose’)
<br/> , Schema = mongoose.Schema
<br/>
<br/>mongoose.connect(‘mongodb://localhost/test’);
<br/>
<br/>var TestSchema = new Schema({
<br/> user_id : {type : Number, index : true}
<br/> ,username : {type : String}
<br/>});
<br/>
<br/>var model_name = coll_name = ‘taobao’;
<br/>mongoose.model(model_name, TestSchema, coll_name);
<br/>
<br/>var TAOBAO = mongoose.model(model_name, coll_name);
<br/>var taobao = new TAOBAO();
<br/>taobao.user_id = 1;
<br/>taobao.username = ‘xuanhou’;
<br/>taobao.save(function(err) {
<br/> if (err) {
<br/> console.log(‘save failed’);
<br/> }
<br/> console.log(‘save success’);
<br/>});</pre>
<br/><ul>
<br/> <li>执行test.js</li>
<br/></ul>
<br/><em>node test.js</em>
<br/><ul>
<br/> <li>查看是否执行成功:</li>
<br/></ul>
<br/><pre escaped=“true” lang=“javascript” line=“1”>[xuanhou.ysh@XXXX test]$ mongo
<br/>MongoDB shell version: 1.8.0
<br/>connecting to: test
<br/>> show collections
<br/>system.indexes
<br/>taobao
<br/>> db.taobao.find()
<br/>{ “_id” : ObjectId(“4db65fafcb4312401d000001”), “user_id” : 1, “username” : “xuanhou” }
<br/>> exit
<br/>bye</pre>
<br/><blockquote>为什么还要基于node-mongodb-native开发mongoose呢?</blockquote>
<br/>下面是node-mongodb-native实现的代码相信能让你了解为什么很多人选择Mongoose(callback层数太多):
<br/><pre escaped=“true” lang=“javascript” line=“1”>
<br/>
<br/>var client = new Db(‘integration_tests_20’, new Server(“127.0.0.1”, 27017, {}));
<br/> client.open(function(err, p_client) {
<br/> client.createCollection(‘test_insert’, function(err, collection) {
<br/> client.collection(‘test_insert’, function(err, collection) {
<br/> for(var i = 1; i < 1000; i++) {
<br/> collection.insert({c:1}, function(err, docs) {});
<br/> }
<br/>
<br/> collection.insert({a:2}, function(err, docs) {
<br/> collection.insert({a:3}, function(err, docs) {
<br/> collection.count(function(err, count) {
<br/> test.assertEquals(1001, count);
<br/> // Locate all the entries using find
<br/> collection.find(function(err, cursor) {
<br/> cursor.toArray(function(err, results) {
<br/> test.assertEquals(1001, results.length);
<br/> test.assertTrue(results[0] != null);
<br/>
<br/> // Let’s close the db
<br/> client.close();
<br/> });
<br/> });
<br/> });
<br/> });
<br/> });
<br/> });
<br/> });
<br/> });
<br/></pre>
<br/><blockquote>目前Mongoose的开发情况如何?</blockquote>
<br/>Mongoose已经实现了大部分功能,但还有些Mongodb提供的feature没有实现,所以也给使用者提供了打补丁的机会,下面是我最近给Mongoose打的两个补丁:
<br/><ul>
<br/> <li>让mongoose支持distinct操作</li>
<br/></ul>
<br/><pre escaped=“true” lang=“javascript” line=“1”>Index: model.js
<br/>===================================================================
<br/>— model.js (revision 12218)
<br/>+++ model.js (working copy)
<br/>@@ -492,6 +492,34 @@
<br/>};
<br/>
<br/>/**
<br/>+ * distinct
values for key
<br/>+ *
<br/>+ * @param {String} key
<br/>+ * @param {Object} conditions
<br/>+ * @param {Function} optional callback
<br/>+ * @api public
<br/>+ /
<br/>+
<br/>+Model.distinct = function (key, conditions, callback) {
<br/>+ if (‘function’ == typeof conditions) {
<br/>+ callback = conditions;
<br/>+ conditions = {};
<br/>+ }
<br/>+ var query = new Query(conditions, key).bind(this, ‘distinct’);
<br/>+ if (‘undefined’ == typeof callback)
<br/>+ return query;
<br/>+ var cQuery;
<br/>+ if (cQuery = this._cumulativeQuery) {
<br/>+ merge(query._conditions, cQuery._conditions);
<br/>+ if (query.options && cQuery.options)
<br/>+ merge(query.options, cQuery.options);
<br/>+ delete this._cumulativeQuery;
<br/>+ }
<br/>+ if (!query.model) query.bind(this, ‘distinct’);
<br/>+ return query.distinct(callback);
<br/>+};
<br/>+
<br/>+/*
<br/>* where
enables a very nice sugary api for doing your queries.
<br/>* For example, instead of writing:
<br/>* User.find({age: {$gte: 21, $lte: 65}}, callback);</pre>
<br/><pre escaped=“true” lang=“javascript” line=“1”>Index: query.js
<br/>===================================================================
<br/>— query.js (revision 12218)
<br/>+++ query.js (working copy)
<br/>@@ -11,6 +11,10 @@
<br/>
<br/>function Query (criteria, options) {
<br/>options = this.options = options || {};
<br/>+ if (‘string’ == typeof options) {
<br/>+ this._key = options;
<br/>+ options = this.options = {};
<br/>+ }
<br/>this.safe = options.safe
<br/>this._conditions = {};
<br/>if (criteria) this.find(criteria);
<br/>@@ -730,6 +734,24 @@
<br/>};
<br/>
<br/>/**
<br/>+ * Casts this._conditions and sends a distinct
<br/>+ * command to mongodb. Invokes a callback upon
<br/>+ * receiving results.
<br/>+ *
<br/>+ * @param {Function} callback fn(err, cardinality)
<br/>+ * @api public
<br/>+ /
<br/>+Query.prototype.distinct = function (callback) {
<br/>+ this.op = ‘distinct’;
<br/>+ var model = this.model;
<br/>+ this.cast(model);
<br/>+ var castQuery = this._conditions;
<br/>+ var key = this._key;
<br/>+ model.collection.distinct(key, castQuery, callback);
<br/>+ return this;
<br/>+};
<br/>+
<br/>+/*
<br/>* Casts the query, sends the update command to mongodb.
<br/>* If there is an error, the callback handles it. Otherwise,
<br/>* we just invoke the callback whereout passing it an error.</pre>
<br/><ul>
<br/> <li>让$gt/$gte/$lt/$lte等操作支持字符串参数</li>
<br/></ul>
<br/><pre escaped=“true” lang=“javascript” line=“1”>Index: string.js
<br/>===================================================================
<br/>— string.js (revision 12218)
<br/>+++ string.js (working copy)
<br/>@@ -139,10 +139,15 @@
<br/>}
<br/>
<br/>SchemaString.prototype.$conditionalHandlers = {
<br/>- ‘$ne’: handleSingle
<br/>+ ‘$lt’: handleSingle
<br/>+ , ‘$lte’: handleSingle
<br/>+ , ‘$gt’: handleSingle
<br/>+ , ‘$gte’: handleSingle
<br/>+ , ‘$ne’: handleSingle
<br/>, ‘$in’: handleArray
<br/>, ‘$nin’: handleArray
<br/>};
<br/>+
<br/>SchemaString.prototype.castForQuery = function ($conditional, val) {
<br/>var handler;
<br/>if (arguments.length === 2) {</pre>
通过 mongoose 能不能把一个文件存到mongodb数据库中去,希望大家提供思路!!!
我目前是写了一个nodejs负责将CSV文件中的内容导入到mongodb中去的。 <br/> <br/>1)生成CSV文件(mysql数据库导出的数据) <br/>2)NodeJs每次读一行,然后分割为很多个fields,然后调用save将这些field组成的document插入到mongodb中 <br/>3)读取文件结束,关闭连接
mongoose是一个orm,如果只是想简单的读写,不需要定义schema和验证,可以方便的使用mongoq <br/> https://github.com/zzdhidden/mongoq
[…] http://cnodejs.org/blog/?p=824 此条目发表在 未分类 分类目录,贴了 mongodb, mongoose, 学习 […]
[…] http://cnodejs.org/blog/?p=824 此条目发表在 转载 分类目录,贴了 mongodb, mongoose, 学习 […]
你实现mongoose存取文件了吗 存文件就是将文件转成字节流然后存进去 我现在不知道怎么取出来
层数太多那个例子,貌似和node-mongodb-native没关吧?
学习中~
关于第一个例子: helomongoose.model(model_name, TestSchema, coll_name); var TAOBAO = mongoose.model(model_name, coll_name);
为什么这样写? 表示不是很明白。可以这样吗?
var TAOBAO = mongoose.model(model_name, TestSchema, coll_name);