Articles of mongodb

在/从MongoDB中存储和检索JavaScript对象

我目前正在使用node-mongo-native驱动程序使用node.js和MongoDB。 我testing了一下使用Mongo控制台存储和检索JS对象。 我想通了,如果我存储一个包含函数/方法的对象,方法和函数也将被存储在集合中。 这很有趣,因为我认为函数不能存储在MongoDB中(除了system.js集合,正如Mongo文档所build议的那样)。 它不仅存储方法,而且实际上是对象的整个原型链的每个方法和成员。 除此之外,我不喜欢这种行为,认为这是不直观的,我不能拥有它。 我正在pipe理Mongo集合中的用户。 要做到这一点,我有一个用户对象包含用户的每个实例作为原型的所有用户方法。 用户对象本身只包含用户属性。 如果我将用户存储在Mongo集合中,我只想存储用户对象的属性。 没有原型成员,特别是没有原型方法。 目前我没有看到如何干净地做到这一点。 我想的选项可能是: 使用foreach和hasOwnProperty创build一个浅拷贝并将其存储在集合中。 为每个包含所有对象属性的用户添加一个数据属性,并可将其存储在集合中。 刚才我想起了这个:我也可以将所有原型属性设置为不可枚举,这样可以防止它们存储在集合中。 但是,反过来,我也遇到了相同的问题:从集合中加载用户时。 AFAIK没有办法在JavaScript创build后改变对象原型。 当Mongo实例化从集合中检索到的对象时,也无法指定要使用的原型。 所以基本上我总是得到使用Mongo从Objectinheritance的对象。 据我可以告诉我有2个选项从这一点恢复一个可用的用户对象: 创build一个从Userinheritance的新对象,并将结果对象上的每个属性复制到新创build的对象。 (与存储机制1和3兼容) 创build一个从Userinheritance的新对象,并将结果对象作为数据属性存储在新创build的对象上。 (兼容存储机制2) 我的假设,特别是关于指定查询结果原型的可能性,是否正确? 什么是正确的做法,为什么? 我当然不是第一个使用node.js在MongoDB中存储和复制对象的人。 目前我会用2/2的方法去。 我不是很喜欢它,但是它是最有效率的,也是唯一一个可以和API一起干净利落的工具。 不过,我更愿意听到API实际上并没有错,但我不知道如何正确使用它。 所以,请赐教:)

mongoose,find,返回特定的属性

我有这个电话: exports.getBIMFromProject = function(req, res){ mongoose.model('bim').find({projectId: req.params['prj_id']}, function(err, bim){ if(err){ console.error(err); res.send(500) } res.send(200, bim); }); }; 我在哪里指定我想返回哪些属性? 在文档中找不到它。 以上返回整个对象。 我只想要返回一些属性。 这是我的模式: var mongoose = require('mongoose'), Schema = mongoose.Schema; var bimSchema = new Schema({ projectId: Number, user: String, items:[ { bimObjectId: Number, typeId: String, position:{ floor: String, room:{ name: String, number: String } } } […]

Express不能使用PUT / DELETE方法。 出了什么问题?

好吧,所以我有一个简单的node.js / express.js / mongodb应用程序设置在这里与我的configuration如下。 var express = require('express'), mongoose = require('mongoose'); http = require('http'); var app = express(); app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); //middleware stack app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + "/public")); }); mongoose.connect("mongodb://localhost/hello"); 问题在于当我尝试做PUT或DELETE请求时。 我的表单很简单 <form method="POST" action="/users/#{user.name}"> <input type="hidden" name="_method" value="PUT"/> </form> 现在我的路由器用express .put()方法捕获路由 app.put('/users/:name', function(req, […]

连接使用mongoose的MongoDB的TImeout

我有一个运行在Node,Express和MongoDB上的Web应用程序。 我使用mongoose作为ODM。 当我用mongodb版本v3.0.1testing我的应用程序时,它运行良好,并没有错误。 但是当我运行相同的代码v3.2.10一段时间后,我得到一个连接超时。 我得到以下错误: Error: connection timeout at null.<anonymous> (/webapp/node_module/mongoose/lib/drivers/node-mongodb-native/connection.js:186:17) 我使用mongoose.connect为本地MongoDB实例的数据库连接。 连接方式有什么变化吗?

用node / express显示BASE64video

所以,有点奇怪的问题。 我有一堆媒体文件保存为mongo中的base64string,有些是图像,有些是video。 我做了一个获取媒体文件的API: app.get('/api/media/:media_id', function (req, res) { media.findById(req.params.media_id) .exec(function (err, media) { if (err) { res.send(err); } var file = new Buffer(media.file, 'base64'); res.writeHead(200, {'Content-Type': media.type, 'Content-Transfer-Encoding': 'BASE64', 'Content-Length': file.length}); res.end(file); }); }); 现在,图像没有问题。 它们直接从API中加载,并且当我从前端调用API(例如<img src="/api/media/23498423"> )时, 问题 如果我从前端获取video(如图像),但使用video或对象标记: <video src="/api/media/3424525" controls></video> 没有问题,但是如果我直接从API的浏览器中加载video: http://localhost:8080/api/media/3424525 服务器进程崩溃,没有错误。 它只是冻结起来。 而我们并不是在谈论庞大的video文件 – 这是一个1.5MB的video。 所有正在testing的video的标题中的媒体types是video/mp4 。 哦,只是要清楚:如果我对图像做同样的事情,一切都很完美。 编辑: 好吧,就像@idbehold和@zeeshan所build议的那样,我看了一下gridfs和gridfs-stream,为了我的应用程序的目的,这当然是我本来应该使用的。 […]

使用Mongoose中的UUID作为ObjectID引用

我正在用Node.js,Express和MongoDB使用mongoose构build一个CRUD风格的REST服务。 该服务将允许已经存在的android应用程序的用户在线上传/同步他们各个数据库的内容。 现有应用程序的数据模型使用UUID(用Java生成)与较短的单调MongoDB样式_id字段冲突。 由于数据模型已经存在,并且被来自许多用户的数据填充,所以我无法将源数据转换为单调的MongoDB样式_id 。 这让我想到了两个选项:1)让Mongo / Mongoose(或者其他一些ODM)可以用完整的UUID代替单调的_id s,或者2)为mongoose模型添加一个uuid字段到_id领域,并打破这种做法的陷阱。 我试图select#1选项,并遇到ObjectID引用的问题。 我最初偶然发现了mongoose-uuid ,但不幸的是,这不能正常工作,因为它在创build新的Mongoose对象时覆盖了我明确设置的_id值。 潜入插件代码,它假定一个对象是新的(通过调用检查Mongoose的.isNew值),从而用新的uuid覆盖_id 。 由于在Mongo中创build新文档时我需要保留原始的uuid,所以这个插件不适合我。 接下来,我发现mongoose的创始人亚伦·赫克曼(Aaron Heckmann)在一个类似的话题上发表了一篇文章 。 这是有帮助的,但是我现在遇到了我不能让我的mongoose模式通过ObjectID相互引用的问题,因为他们在技术上现在使用String`_ids来引用对方。 架构示例: var mongoose = require('mongoose'); var uuid = require('node-uuid'); var Schema = mongoose.Schema; var trackPassSchema = new Schema({ _id: { type: String, default: function genUUID() { uuid.v1() }}, //Omitting other fields in snippet for simplicity vehicle: […]

在meteorspacebars模板中按索引返回数组项

我想访问一个meteor模板内的数组的第一项,我使用这个语法: <p>{{array[0]}}</p> 但是,它似乎并没有工作。 我不想使用{{#each}}遍历值,只需从数组中select第一个。

带有一对多关系的Mongoose文档引用

我正在为一个新项目devise一个数据库结构,而且我对MongoDB很陌生,显然是Mongoose。 我已经阅读了Mongooses 人口文档,它有一个一对多的关系,一个Person文档到很多Story文档,但是让我困惑的部分是在哪里,而不是Story文档引用什么Person文档, Person模式已经设置好了,所以它有一个它拥有的Story文档的数组。 我正在build立一个非常相似的东西。 但我一直认为创build具有Person文档ID的新Story文档会更容易。 但也许这只是因为我更熟悉使用连接的MySQL关系。 如果这是做这件事的最好方法(我敢肯定,自从它在文档中),当创build新的Story文档时,更新它所属的关联的People文档中的故事数组的最佳方式是什么? ? 我看了,但找不到更新现有文档的任何示例,以添加对其他文档的引用(或删除它们) 我确信这是一个简单的解决scheme,我只是忽略了什么,但任何帮助将是伟大的。 谢谢!

我可以通过id从Mongo检索多个文档吗?

我有一个ID数组,我想一次检索所有的人。 这是可能的,我可以通过一个ID数组,并让他们都回到我身边? 如果是这样,怎么样? 我正在使用节点本机驱动程序。 谢谢!

dynamic数据库连接到来自nodejs的mongodb或mongoose

我正在尝试创build一个多租户应用(saas),每个客户都有自己的数据库。 我的情况是: 我创build了一个中间件,可以确定哪个客户端基于子域,然后从通用数据库中检索客户端的数据库连接信息。 我不知道如何build立这个客户端的连接对象,以便能够在我的控制器中使用。 我应该在中间件还是控制器中执行此操作? 如果它在模型中,我如何传递连接string和参数(我可以使用会话,但是我不知道如何从模型中访问会话)。 我如何做到以下几点? 组织:我在哪里dynamic创build客户端数据库连接? 将连接参数注入/传递给控制器​​或模型(在进行连接定义的情况下) dynamic连接完成后,我如何在全球范围内访问该客户端? 这是我的中间件的一个例子,我想创build一个mongoose的连接,我想dynamic(通过客户端的连接信息): function clientlistener() { return function (req, res, next) { console.dir('look at my sub domain ' + req.subdomains[0]); // console.log(req.session.Client.name); if (req.session.Client && req.session.Client.name === req.subdomains[0]) { var options = session.Client.options; var url = session.Client.url var conn = mongoose.createConnection(url, options); next(); } } } 如何从控制器内部访问这个连接对象? […]