Articles of mongodb

如何将一个Mongoose对象与一个JSON对象进行比较?

这是我的问题。 一方面,我有一个简单的对象表示一个Mongoose对象。 另一方面,我有一个来自数据库中的findOne的Mongoose对象。 我想要做的是检查两个对象的两个属性之间是否有任何不同。 我们来考虑一下这种模型: { _id: 'abc', id: 'abc', things: [{ _id: 'def', id: 'def', other_things: [{ _id: 'ghi', id: 'ghi', foo: 'bar' }] }] } 我想比较myplainobject.things和mydbobject.things 。 但是,使用underscore , underscore . _.isEqual(myplainobject.things, mydbobject.things)总是失败。 这是由于第一个string中的id和另一个ObjectID中的id所致。 虽然有很多方法可以将ObjectID与string进行比较,但有没有比较对象的优雅方法? 或者我必须实现我自己的解决scheme,将遍历每个子文档,并手动比较属性?

mongoosevalidation – 执行多个自定义validation

我有一个基本的mongoose模式: var userSchema = new Schema({ userName: {type: String, required: 'Please enter a username'}, email: {type: String, required: 'Please enter email'}, password: {type: String, required: 'Please create a password'}, created: {type: Date, default: Date.now} }); 我执行一个自定义的validation器,调用一个小的服务(在另一个文件中)来查找电子邮件地址是否已被使用: userSchema.path('email').validate(function(value, next) { userService.findUser(value, function(err, user) { if (err) { console.log(err); return next(false); } next(!user); }); }, 'Already exists'); […]

用MongoDB向上插入项目数组

我有一个我想插入到MongoDB集合的对象数组,但是我想检查每个项目是否已经存在于集合中。 如果不存在,则插入它,如果存在,则不要插入它。 谷歌search后,看起来像我最好使用更新方法与upsert属性设置为true。 这似乎工作得很好,如果我传递一个单一的项目,以及如果我迭代我的数组,并一次插入一个项目,但我不知道这是否是正确的方法来做到这一点,或者如果它最高效的。 以下是我目前正在做的事情: var data = [{}, {}, … {}]; for (var i = 0; i < data.length; i++) { var item = data[i]; collection.update( {userId: item.id}, {$setOnInsert: item}, {upsert: true}, function(err, result) { if (err) { // Handle errors here } }); } 迭代我的数组并逐个插入它们是最有效的方法,或者有更好的方法吗?

链接Q.ninvoke时键入错误

当我试图使用Q连接Node.js中的mongodb函数时出现错误,如下所示: Q.ninvoke(MongoClient, 'connect', 'mongodb://127.0.0.1:27017/mydb') .then(function(db){ return Q .ninvoke(db, 'createCollection', 'mycollection') .ninvoke(db.collection('mycollection'), 'createIndex', {id: 1}) // error occurs here .ninvoke(db, 'close') .then(function(){…}) }); 我得到的错误消息: TypeError: Cannot call method 'apply' of undefined at Promise.post (/path/to/my/project/node_modules/q/q.js:1157:36) at Promise.promise.promiseDispatch (/path/to/my/project/node_modules/q/q.js:784:41) at /path/to/my/project/node_modules/q/q.js:600:44 at runSingle (/path/to/my/project/node_modules/q/q.js:133:13) at flush (/path/to/my/project/node_modules/q/q.js:121:13) at process._tickCallback (node.js:442:13) 根据这个消息,q.js中的第1157行是关于: Q.fulfill = fulfill; function fulfill(value) { return […]

MongoDB过滤多个子文档

我在mongo数据库中有这样的文档结构,我想过滤只显示活动的子文档:活跃的汽车和活跃的水果。 { "name":"Andre", "fruits":[ { "active":true, "fruitname":"apple" },{ "active":false, "fruitname":"banana" } ], "cars":[ { "active":false, "carname":"ford" },{ "active":true, "carname":"GM" }, ] } 这是我想要的结果。 { "name":"Andre", "fruits":[ { "active":true, "fruitname":"apple" } ], "cars":[ { "active":true, "carname":"GM" }, ] } 我尝试过Aggregate但是当任何车辆或任何水果活跃时,它都不会返回。 m_object.aggregate([ { $match : { "name": "andre" }}, { $unwind : "$fruits" }, { $unwind : […]

Mongoose ID函数返回null

我试图从MongoDB获取一个子文档。 我可以得到父文件,如下所示: { "_id" : ObjectId("5550a7948be994430f7df1b4"), "address" : "Grafton St, Dublin 2", "coords" : [ -6.2597468, 53.3422998 ], "facilities" : [ "food", "irish history" ], "name" : "Laura Dunphy", "openingTimes" : [ { "days" : "Monday – Friday", "times" : [ "10am", "12pm", "2pm" ] }, { "days" : "Saturday", "times" : [ "8am", "10am", […]

selectvsfind和在哪里find在Mongoose

在Mongoose文档中有这个小片段: Person .find({ occupation: /host/ }) .where('name.last').equals('Ghost') .where('age').gt(17).lt(66) .where('likes').in(['vaporizing', 'talking']) .limit(10) .sort('-occupation') .select('name occupation') .exec(callback); 我很难理解.find({ occupation: /host/ })与.select('name occupation') .find({ occupation: /host/ })不同的.select('name occupation') 。 是否find像在哪里添加条件? 还是它控制返回的字段? 更新好了,所以我看到select只控制查询的最终结果的字段,但现在我不明白如何Find和Where是不同的。 我不能使用Find和使用Where创build相同的查询? 下面的代码片段是一样的吗? Person .where('occupation').equals('host') .where('name.last').equals('Ghost') .where('age').gt(17).lt(66) .where('likes').in(['vaporizing', 'talking']) .limit(10) .sort('-occupation') .select('name occupation') .exec(callback);

mongoose如何在模型中设置date格式

我是新的mongoose。 我使用“date”作为我的“holidayDate”列的types。 我想在我的“holidayDate”列中只存储date而不是时间,所以有什么办法来定义域模型中的date格式,所以当我的域名保存时,我的“holidayDate”列值将根据域模型的date格式进行保存。 var HolidaySchema = new Schema({ holidayName: { type: String, default: '', required: 'Please fill holiday name', trim: true }, holidayDate: { type: Date, required: 'Please fill From Date' } }); mongoose.model('Holiday', HolidaySchema);

重用节点中的MongoDB连接

这是我得到的错误: [Error: db object already connecting, open cannot be called multiple times] 。 我在这个誓言testing中有一个全球性的mongo对象。 mongo = new mongo.Db(config.api.apiTest, new mongo.Server('localhost', 27017, {}), {native_parser: off, safe: true}) 当我第二次尝试打开它时出现此错误。 所以即使我第一次使用db.close()它似乎并不closures。 有没有其他方式重新使用连接? .addBatch( "Redis – ": "Standard account – ": topic: -> # . redisClient.del "#{ accountId }:900" mongo.open (error, db) => secondDb = db.db config.api.accountTest secondDb.collection 'accounts', […]

在mongo中用id或用户名查找

我试图做一个用户名或_id这样的查找 exports.getUser = function (req, res){ User.find({ $or: [ {username:req.params.id}, {_id:req.params.id} ] }) .exec(function (err, collections) { res.send(collections); }); }; 它在我通过_idsearch时起作用,但因用户名失败而失败,因为它无法返回有效的OjectID。 我试着做这样两个单独的查询 exports.getUser = function (req, res){ User.findOne({username:req.params.id}).exec(function (err, user) { if (user) res.send(user); }); User.findById({_id:req.params.id}).exec(function (err, user) { if (user) res.send(user); }); }; 但如果用户不存在,则会挂起,因为它从不发送响应。 由于节点是asynchronous我得到Error: Can't set headers after they are sent. 如果我添加 else […]