Articles of mongoose

使用jasmine.spyOn用于mongoose模式方法

我无法让茉莉间谍为我的mongoose文件工作。 我有一个方法设置在我的用户架构像这样: User.methods.doSomething = function() { // implementation } 用户是我正在testing的模型的依赖关系,我想确保doSomething被正确调用。 在我的testing中,我有这样的东西: spyOn(User.schema.methods, 'doSomething') 如果我注销User.schema.methods.doSomething我得到我期望的function,但是当我运行调用该方法的代码原始实现被调用,而不是间谍。 我也不能这样做: spyOn(userInstance, 'doSomething') 在我的testing中,userInstance没有被暴露,我真的想避免暴露它。 本质上,我想在用户文档(实例?)原型上设置一个间谍。 那可能吗?

在mongoosepre中间件,我如何访问更新查询?

我正在尝试使用mongoose> 4.0.0的新不稳定版本来validation更新查询。 说我想要使用以下查询更新架构 schema.update({_id:'blah'},{a:'blah'},function(err){ //do your thing }) 所以可以说我有以下模式, var schema = new Schema({ a:{type:String} }); schema.pre('update',function(next){ var findQuery=this._conditions; // gives {_id:'blah'} // how do i get {a:'blah'}???? next(); }); 我如何得到{pre:中间件中的{set:{a:'blah'}}的更新查询,以便在执行更新之前执行一些检查? 或者我知道更新查询可以在post中间件中访问, schema.post('update',function(){ var findQuery=this._conditions; // gives {_id:'blah'} var updateQuery=this._update; //gives {$set:{a:'blah'}} next(); }); 但是这太晚了,我需要在pre中间件中检查实际更新数据库之前。 我试图通过前中间件的这个“对象”,但无法find任何地方的updateQuery对象,而这个._update在前置中间件中是未定义的。 有没有办法做到这一点? 谢谢

我更好地分裂一个精心制作的mongoose模型?

假设/login API的情况下,对于一组匹配的凭证,应该返回来自集合的用户对象,哪种方法会更有效: 1)一个带投影查询的模型: var UserSchema = new Schema({ name : String, email : String, dob : Number, phone : Number, gender : String, location : Object, // GeoJSON format {type: 'Point', geometry: { lat: '23.00', lng: '102.23' }} followers : [UserSchema], following : [UserSchema], posts : [PostSchema], groups : [GroupSchema] // … and so on […]

Mongoose模式/查询最佳实践(MongoDB,node.js)

我试图在node.js应用程序中用Mongoose分解我的RDBMS思想,并且可以使用一些指导来了解最佳实践。 一个简单的例子:假设有两个集合,组织和联系人。 这是一对多的关系,他们都需要孤独。 然而,在索引方法中,我想返回一个组织对象数组,每个组织对象都有一个成员联系对象数组。 (后来我想返回一组联系人,每个联系人都有一个组织对象。) 在我看来,我误解了完成这个的最好方法。 以下是我迄今看到的选项: 将联系人与他们的IDembedded组织文档中。 索引查询可以是Organization.find({}, function(err, orgs) { orgs[n].contacts[n]…}) 。 缺点 :需要大量额外的存储空间,并且每次更改“主”联系人文档时都必须更新embedded式联系人文档。 利用Mongoose的populate / DBRef结构在两个表中存储“外键”标识符。 查询可以是: Organization.find({}}.populate('contacts').run(…) 。 缺点 :你必须在两边存储密钥。 去比较传统的“外键”路线,在联系人文件中只存储组织ID。 查询组织文档,然后查询组织查询的callback中的所有联系人,将数据组合成一个对象返回。 缺点 :多个查询和额外的处理开销(我相信我们必须独立地为这些组织find组织和联系人,然后迭代每个组织,在公共_id字段上手动匹配,将它们组合成一个新的输出对象)。 我必须错过一个更好的select。 允许#3的模式的东西,但返回所需的组合的对象,更less的开销。 注意 : asynchronous模块似乎可以帮助这个,但是这真的是唯一的/最好的方式吗?

在用户注销后,如何防止浏览器的后退button访问受限制的信息?

我使用这个例子在github上find护照本地策略与mongoose/ mongodb。 我遇到的问题是当用户注销时,他们仍然可以通过点击浏览器上的后退button来访问受限制的信息。 我对node.js很陌生,但我想象一下,在执行后退和前进button之前,需要实现某种types的hook来调用ensureAuthenticated函数 – 位于代码的最底层。 在用户注销后,如何通过点击后退button来防止用户访问受限制的信息? var express = require('express') , passport = require('passport') , LocalStrategy = require('passport-local').Strategy , mongodb = require('mongodb') , mongoose = require('mongoose') , bcrypt = require('bcrypt') , SALT_WORK_FACTOR = 10; mongoose.connect('localhost', 'test'); var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function callback() { console.log('Connected to DB'); }); // User […]

mongoose:“_doc”怎么了?

看起来mongoose在内部正在做一些非常有趣的事情。 1 var Foo = new mongoose.model('Foo', new mongoose.Schema({a: String, b: Number})); 2 var foo = new Foo({a: 'test; b: 42}); 3 var obj = {c: 1}; 4 foo.goo = obj; // simple object assignment. obj should be // passed by reference to foo.goo. recall goo // is not defined in the Foo model schema […]

将项目名称添加到keystone.js中的关系字段中

有没有人有一个很好的例子,在keystonejs中的关系字段添加名称? 现在它只是保存一个ID,所以如果我需要显示在玉模板中的字段名称我也需要查询该关系模型。 理想情况是这样的: var keystone = require('keystone'), Types = keystone.Field.Types; /** * Titles Model * ============= */ var Title = new keystone.List('Title'); Title.add({ name: { type: String, required: true, initial: true }, room: { type: Types.Relationship, initial: true, required: true, ref: 'Screening', addNew: false }, businessUnit: { type: Types.Relationship, initial: true, required: true, ref: 'BusinessUnit', […]

NodeJS Mongoose Schema“保存”functionerror handling?

我有一个问题向用户输出一个错误,使用res.send(err),这是在Mongoose用户模式的“保存”function的callback中被调用。 我想要注意的是,当我使用console.log(err)时,它显示预期的错误(如用户名太短),但res.send在PostMan发送请求时使用POST值输出“{}”应该会导致错误。 另外我想知道是否应该在我的路由器或我的Mongoose用户模式.pre函数进行inputvalidation? 把validation看起来是正确的,因为它使我的节点路由器文件更清洁。 这里是有问题的代码… 应用程序/路由/ apiRouter.js var User = require('../models/User'); var bodyParser = require('body-parser'); … apiRouter.post('/users/register', function(req, res, next) { var user = new User; user.name = req.body.name; user.username = req.body.username; user.password = req.body.password; user.save(function(err) { if (err) { console.log(err); res.send(err); } else { //User saved! res.json({ message: 'User created' }); } }); }); […]

mongoose填充

这是我的testing代码,我不知道为什么它不工作,因为它是非常类似于testing“一次填充子数组的多个孩子” 。 var mongoose = require('mongoose'), Schema = mongoose.Schema, ObjectId = Schema.ObjectId; mongoose.connect('mongodb://localhost/testy'); var UserSchema = new Schema({ name: String }); var MovieSchema = new Schema({ title: String, tags: [OwnedTagSchema] }); var TagSchema = new Schema({ name: String }); var OwnedTagSchema = new Schema({ _name: {type: Schema.ObjectId, ref: 'Tag'}, _owner: {type: Schema.ObjectId, ref: 'User'} }); […]

Mongooseasynchronous默认值

这不是在文档中,但我想弄清楚如何设置与Mongooseasynchronous默认值。 我看到了model.pre("save", function(next){})设置,但我不知道如何改变当前正在保存的模型上的字段。 mongoose是否将其绑定到正在保存的物品上?