Tag: mongoose

mongoose从查询设置本地variables

我有一个函数,基本上查询MongoDB的凭证(简化): var query = Credential.findOne({token: token}); return query.exec(function (err, credential) { if (err) return null; return credential; }); 我需要这个credential的另一个查询来获得相关的angular色: router.get('/api/roles', function (req, res) { var token = req.headers.authorization || ''; var cred; if (token === '') { return res.sendStatus(401); } getCredential(token).then(function (credential) { cred = credential; }); getRoles(cred).then(function(roles) { return res.json(roles); }); }); 不幸的是,我似乎无法在已解决的承诺中设置局部variablescred ,因此它是undefined […]

Mongoose更新子文档数组

我可以更新匹配我的更新查询数组中的所有子文档? 这里是收集元素的例子: { x: 1, myarray: [ { a: 1, b: 2, }, { a: 1, b: 4, } ] } 然后我写这样的查询: MyModel.update({x: 1, myarray.a: 1}, {$set: {"myarray.$.b": 3} }, function(err) { }); 它只更新myarray中的第一个子文档。 在文档中写道,这种查询只更新第一个文档。 我想知道是否有更新数组中所有匹配的子文档的方法。 提前致谢。

可能填充两个级别?

说我有如下的collections品/文件: 问题收集: { _id: ObjectId("0000"), title: "test question", survey: ObjectId("1234") //abbreviated for question assume this is a legit object id } 调查收集: { _id: ObjectId("1234"), title: "survey title!", user: ObjectId("5678") } 用户集合: { _id: ObjectId("5678"), Name: "Abe" } 有没有办法给我打电话: questions.findOne({_id: "0000"}).populate("survey.user") 获取用户信息与问题? 我明白,我可以填补question的直接父母,但我很好奇,如果可以为祖父母。

如何在async.each中包含async.waterfall的外部函数中调用async.each

我在Node.JS中有一个出口模块 exports.doSomethingImportant= function(req, res) { var id = req.params.id; Demo.findOne({'_id': id}) .exec(function(err, demosReturned) { async.waterfall([ function(outerCallBack){ console.log("In the First Call Back"); firstOrderFunction(demosReturned,outerCallBack); }, function(x,outerCallBack){ var y =3 var z = x*y; console.log("In the Second Call Back"); outerCallBack(null,z); } ],function(err,z){ if(err){ console.log("Error is == " +err); }else{ console.log("The Returned Value is == "+z); } }); });//End […]

找回内部callback的另一个发现(…),如何逃离callback地狱?

(第一:对不起,我不太会说英文!) 我想在一个数组中返回3个发现的结果。 我的代码(下)运行良好,但我在callback地狱! _Schema .static('retrieveAll', function(cb) { query = {}; this.find(query, function(err, data) { if(err) { cb(err, null); return; } if(data) all = data; else all = []; _StoresModel.find(query).select('contact address').exec(function(err, data) { if(err) { cb(err, null); return; } if(data) { all = data.reduce(function(coll, item) { coll.push(item); return coll; }, all); } _CustomersModel.find(query).select('contact address').exec(function(err, data) { […]

什么是处理国家作为对mongoose属性(mongodb)的理想方式?

我在jobSchema上有一个名为country的属性,它是必需的string。 基本上只是得到ISO-2字母代码(即:美国,新西兰或其他)…这就是保存在数据库中的对象的country属性。 然而,我有一个文件系统上的包含一个对象,包含全名(即:美国)和纬度/经度坐标的countries.json文件。 { "name": "United States", "iso2": "US", "lat": "37.09024", "lng": "-95.712891" } 我真的不需要任何crud界面。 所以我已经在数据库之外build立了一个API来将“US”string从数据库映射到文件对象。 但是,这被certificate是一个PITA。 什么是处理这个问题的好方法? 我应该只是将这个完整的国家对象存储在数据库中,并留在那个? 这似乎是最简单的路线,除了一个国家定义的变化,那么我将所有这些陈旧的数据散落在我的mongo数据库,无论这个数据保存在哪里。

mongoose传递类function

当我把函数传给mongoose时,似乎不再有这个参考。 有没有更好的方法去做这件事? 所有function都因为长度原因而被简化。 我无法编辑getUsernameForId函数来获取其他参数。 我有课: var class = new function() { this.func1 = function(data) { return data + "test"; } this.func2 = function(data) { var next = function(username) { return this.func1(username); // THIS THROWS undefined is not a function } mongoose.getUsernameForId(1, func3); } } mongoose是这样的另一个类: var getUsernameForId = function(id, callback) { user_model.findOne({"id": id}, function(err, user) […]

通过Mongoose在MongoDB中存储另一个文档中embedded的文档的副本

我们有要求将一个Mongo文档的副本作为embedded式子文档存储在另一个文档中。 它应该有一个原始文件的参考。 复制的文档需要是深层复制,如原始快照。 原始文档的模式(使用Mongoose定义)不是固定的 – 它当前使用一种inheritance来允许对模式进行不同的添加,具体取决于“types”。 在Mongoose模型中有这样一个灵活的embedded式模式吗? 是否需要在运行时注入,何时才能知道模式? 我们目前的模型/模式是这样的: ///UserList Schema: – this should contain a deep copy of a List user: { type: ObjectId, ref: 'User' }, list: { /* Not sure if this is a how we should store the reference type: ObjectId, ref: 'List' */ listId: ObjectId, name: { type: String, required: […]

mongoose复数集合的定义

我试图创build基于特定id不同的集合,我这样做的方式是: db.save({…}, 'collection_' + id).then(function() { deferred.resolve(); }); 这工作正常,我可以看到我的数据库中的新集合。 然而,当我试图加载这个数据时,它不起作用,因为mongoose强迫它是plurar。 var Items = mongoose.model('collection_' + id, MySchema); Items.count(function(err, count) { console.log(count); = 0 }); 这个id是完全dynamic的,根据我的要求而不同,我怎样才能阻止mongoose在每个集合名称中加上's'?

当modelObject从数据库本身获得时,modelObject.save()是否只更新现有的数据库文档?

要使用演示该问题的示例,假定我有一个由以下模式定义的用户模型: var UserSchema = new Schema({ username: String, email: String } mongoose.model('User', UserSchema); 我知道要使用save方法更新用户,我可以查询用户,然后保存更改,如下所示: User.findOne({username: usernameTofind}, function(err, user) { //ignore errors for brevity user.email = newEmail; user.save(function(err) { console.log('User email updated') }); }); 但是,如果我尝试创build一个新的用户对象与完全相同的字段值(包括_id)是否有覆盖数据库文件的任何可能性? 我不会假设,因为从理论上讲,这意味着恶意用户可能利用不安全的API并覆盖现有文档(例如使用“创build新帐户”请求,这将不会/不能依赖于用户被authentication),但更重要的是,当我尝试使用请求工具(我使用邮差,但我敢肯定类似的curl命令就足够了)这样做,我得到一个重复的_id错误 MongoError: insertDocument :: caused by :: 11000 E11000 duplicate key error index 所以我只想澄清,更新现有文档的唯一方法是查询文档,修改返回的实例,然后调用该实例的save方法,或者使用静态update()。 这两者都可以通过要求authentication来保护。 如果有帮助,我上面提到了这个问题的动机,因为我想确保用户不能覆盖现有文档,如果公开暴露以下方法: userCtrl.create = function(req, res, next) […]