Articles of mongodb

Node.js MongoDB创build多个索引:没有指定索引名称

我正在使用MongoDB 2.6.11版本 我该如何解决这个错误? 在Node.js API参考中 ,您可以传递的唯一参数是一个索引规格数组和一个callback函数,我的意思是指定索引名称? 我正在使用的代码是下面(假设我已经有需要mongoclient和连接到数据库): db.collection("MyCollection").createIndexes( [ {field1: 1}, {field2: 1, field3: 1} ], function(err, result){ //Error handling code } ); 错误代码是67,错误的完整堆栈跟踪如下: MongoError: no index name specified at Function.MongoError.create (/home/ubuntu/workspace/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:31:11) at commandCallback (/home/ubuntu/workspace/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:1154:66) at Callbacks.emit (/home/ubuntu/workspace/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:119:3) at messageHandler (/home/ubuntu/workspace/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:295:23) at Socket.dataHandler (/home/ubuntu/workspace/node_modules/mongodb/node_modules/mongodb-core/lib/connection/connection.js:285:22) at emitOne (events.js:77:13) at Socket.emit (events.js:169:7) at readableAddChunk (_stream_readable.js:146:16) at Socket.Readable.push […]

在Jade中循环显示Mongodb的数据

我一直在做一个现场问答应用程序,在这个应用程序中用户可以创build讨论,在讨论中他们可以提问,然后添加评论的问题。 然而,目前我被困在问题部分。 我可以成功地创build一个讨论,并将讨论的关联问题(存储在MongoDB中作为objectID(discussionID))存储在讨论中。 我试图得到与讨论具有相同ID的问题,并将它们传递给Jade,这样我就可以用div来循环它们。 我的代码到目前为止是: 讨论控制器: function getOne(req, res, next) { Discussion.findOne({_id: req.params.id}, function onDiscussionFound(err, discussion) { if(!discussion) { res.status(404).send("Discussion not found"); } console.log(discussion); // we return the json version with cleaned up model to the user //res.send(discussion.toJSON()); var Questions = Question.find({discussionID: discussion.id}, function(err, data){ console.log(data); }); //console.log(Questions); res.render('discussion', { title: discussion.title, description: discussion.description, user: […]

从MongoDB和Mongoose中的多个文档创build单个文档

我对MongoDB和Mongoose很新,偶然发现下面这个问题:我收集了大约600个这种(缩写)格式的文档: { _id: ObjectId(<Integer>), sA: [ { age: { value: <Integer> } } ] } 文件中的年龄值范围是从0到大约100,但并不是所有的值都被表示出来。 我想输出一个单一的对象的forms { labels: [<Integer>, <Integer>, …], data: [<Integer>, <Integer>, …] } 其中标签是包含所有文档的所有年龄值的数组。 并且数据包含的次数,find了该年龄值。 我的问题是: 由于我对数据库相当陌生,这是甚至有可能与MongoDB? 如果是这样,是否有可能填补标签和数据arrays内的空白? 比方说,输出如下所示: { labels: [0,1,2,6,9] data: [1,17,4,5,3] } 但我希望看起来像这样: { labels: [0,1,2,3,4,5,6,7,8,9], data: [1,17,4,0,0,0,5,0,0,3] } 到目前为止,我还没有能够将这个格式归档,也没有使用mapReducepipe道。 我需要分两步来做吗? 就像输出一个有序的数组,然后在服务器上使用一个Javascript函数来提取和填充数据和标签数组,并在将对象发送回客户端之前填充空白处? 先谢谢你!!

防止在Mongoose中同时访问文档

我的服务器应用程序(使用node.js,mongodb,mongoose)有一个文档集合,对于这两个文档,两个客户端应用程序不能同时修改它们,而不看到彼此的修改。 为了防止这种情况,我添加了一个简单的文档版本控制系统:在模式上检查文档的版本是否有效(即不高于客户端上次读取的版本)。 乍一看,它工作正常: // Validate version number UserSchema.pre("save", function(next) { var user = this user.constructor.findById(user._id, function(err, userCurrent) { // userCurrent is the user that is currently in the db if (err) return next(err) if (userCurrent == null) return next() if(userCurrent.docVersion > user.docVersion) { return next(new Error("document was modified by someone else")) } else { user.docVersion […]

Mongoose更新通过$设置一个值,如果没有定义(NodeJS)

什么是检查未定义值的正确方法? 我想要做的是有一个PUT方法,将更新那些非空的字段。 例如,如果我发送req.body.name = 'John'并且没有req.body.job我希望我的请求只更改名称。 一些代码: router.put('/:id', (req, res) => { const query = {_id: req.params.id}; const update = { $set: { name: req.body.name, job: req.body.job } }; User.findOneAndUpdate(query, update, (err, userUpdated) => { if (err) { console.log('Error while updating'); console.log(err); } else { res.send(userUpdated); } }); }); 这当然会抛出一个错误: CastError: Cast to number failed for […]

使用mongoose的承诺分类文档

当我做console.log(all)我期望找回过滤的sorting数据,而是我回来了整个原始数据。 为什么? var Comp = require("./models/company.js"); var arr = [ {name : "comp1",industry : "industry1", ranking: 20}, {name : "comp2",industry : "industry2", ranking: 5}, {name : "comp3",industry : "industry3", ranking: 10} ] var output = {}; var promise = Comp.find({}).exec() promise.then(function(docs){ return Comp.remove({}).exec() }) promise.then(function(){ console.log("deleted") }) promise.then(function(){ return Comp.create(arr).exec() }) promise.then(function(data){ output.data = data; […]

在NodeJS中嵌套MongoDB查询

我想用NodeJS从MongoDB中的两个集合中进行select。 我从chat_messages集合中select了一个userId属性,我想借助ES6 Promise将结果对象扩展为用户名。 我试过这个: db.collection("chat_messages") .find({"room" : roomName}) .sort({"created" : 1}) .toArray() .then(function(messages){ console.log(messages); return Promise.all(messages.map(function(message){ return db.collection("chat_users") .find({"id" : message.userId}) .limit(1) .toArray() .then(function(users){ message.userName = users[0].name; }); })); }) .then(function(messages){ console.log(messages); }) .catch(function(error){ // … }); 第一个console.log打印这个: [ { _id: 573b6f2af9172fd81252c520, userId: 2, … }, { _id: 57388bd913371cfc13323bbb, userId: 1, … } ] 但第二个看起来像这样: […]

使用mongoose承诺的麻烦

有人能告诉我为什么这个承诺设置不起作用。 它应该删除文档,然后添加它然后find它然后控制它。 这不是安慰数据。 var Comp = require("./models/company.js"); var arr = [ {name : "comp1",industry : "industry1", ranking: 20}, {name : "comp2",industry : "industry2", ranking: 5}, {name : "comp3",industry : "industry3", ranking: 10} ] var output = {}; var promise = Comp.find({}).exec() promise.then(function(res){ console.log("removed") return Comp.remove({}).exec() }) .then(function(){ return Comp.create(arr).exec() }) .then(function(data){ return Comp.find({}).exec(); }) .then(function(data){ […]

select数组中所有值存在于另一个数组中的文档

我不太清楚如何标题! 所以我有一个产品ID的数组 var productIds = [139,72,73,1,6] 还有一些MongoDB中的客户文档 { name: 'James', products: [ 73, 139 ], _id: 5741cff3f08e992598d0a39b } { name: 'John', products: [ 72, 99 ], _id: 5741d047f08e992598d0a39e } 当所有产品都出现在产品ID(productIds)数组中时,我想find客户 我试过了: 'products' : { '$in': productIds } 但是,即使产品ID列表中不存在99,也会返回John 我也试过: 'products' : { '$all': productIds } 没有任何回报,因为没有客户拥有所有的产品 有没有办法在单个查询中实现我所需要的function,还是需要进行一些查询处理? 我也试过了 'products': { '$in': productIds, '$not': { '$nin': […]

如何自动创build一个REST API node.js / MongoDB

我正在运行一个处理REST API调用的node.js服务器。 这些调用的响应将是一个或MongoDB对象(JSON)的列表。 我已经阅读了关于参数和如何处理它们。 但有没有办法自动做到这一点? 可以说我有一个用户集合: name: String, hobby: String, age: Number 现在我想要得到年龄为18的所有用户的列表。 我知道我可以像这样恢复参数: url: http://localhost:3000/user?age=18&hobby=something var app = express(); app.get('/user', function (req,res) { var age=req.query.age; var hobby=req.query.hobby; mondodbUser.find(…); } 但假设用户有10个不同的属性,我有15个不同的集合。 我不能dynamic地做这个吗? 所以我不必恢复每一个可能的参数? 我想能够使用所有给定的参数来searchMongoDB。 我希望我能够expression自己:D谢谢!