我需要检查某个数据库中是否存在集合,如果不存在则创建它.我知道
db.createCollection(collName, {strict:true}, function(error, collection))
Run Code Online (Sandbox Code Playgroud)
collName在创建之前检查是否存在集合并设置error对象.但我需要一个独立的功能来检查.
我正在尝试通过mongoose将我的节点应用程序连接到mongodb.它似乎正在工作,因为我可以添加文档,但我得到错误{ [Error: Trying to open unclosed connection.] state: 2 }.
我创建了一个非常简单的应用程序,只是为了确保在连接我的实际应用程序之前一切正常.
这是我的简单应用程序:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var timeSchema = new Schema({ timestamp: String });
var Time = mongoose.model('Time', timeSchema);
mongoose.connect('mongodb://localhost/mydb');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error: '));
db.once('open', function () {
var testA = new Test({ timestamp: Date() });
});
Run Code Online (Sandbox Code Playgroud)
我也试过添加db.close()到最后,但它没有任何区别.
这是在Ubuntu 14.04 VPS上运行的:
我想将MongoDB本机JS驱动程序与bluebird promises一起使用.我Promise.promisifyAll()该如何在这个库上使用?
我有一个快速应用程序,使用Jade作为视图引擎将数据存储在mongo中.我有一个简单的路线,可以获取特定集合中的文档,每个文档对应一个产品.该图像是base64编码的.当我尝试渲染为图像虽然它不起作用
我的路线是
exports.index = function(req, res){
mongo.getProducts(function(data) {
res.render('consumer/index', {user: req.session.user, products: data});
});
};
Run Code Online (Sandbox Code Playgroud)
调用的函数是
exports.getProducts = function(callback) {
Product.find().exec(function(err, products){
return callback(products);
});
};
Run Code Online (Sandbox Code Playgroud)
然后我的Jade文件有以下代码
each val in products
img(src="data:image/png;base64,'+#{val.image.data}+'", alt='Image', style="width: 20px; height: 20px")
Run Code Online (Sandbox Code Playgroud)
直接在Mongo(通过robomongo)查看文档,我得到了这个


我不知道我缺少什么,因为在另一个文件中我使用jQuery数据表来显示文档,并且相同的方法正确呈现图像,这里是数据表代码的片段
"aoColumns": [
{"mData": "name"},
{"mData": "price"},
{"mData": "category"},
{"mData": "description"},
{"mData": "image.data", "mRender": function ( data, type, full ) {
return '<img src="data:image/png;base64,'+data+'", style="width: 20px; height: 20px"></>'}},
{"mData": "promoted"},
{"mData": null}
]
Run Code Online (Sandbox Code Playgroud) 我正在尝试根据嵌套对象的值对结果进行排序.使用node-mongodb-native,我这样做:
this.collection.find({
"_id": ObjectID(item_id) },
{ "items": 1 },
{ sort : { items.date : 1 }
}, function(err, result) {
if (err) {
callback(err);
} else {
callback(null, result);
}
});
Run Code Online (Sandbox Code Playgroud)
我收到了意外的令牌错误items.date.
items是一个对象数组.有些文件是空数组,有些文件包含数据,包含date字段.
谢谢!
为什么我不能通过_id删除记录?
码:
db.collection('posts', function(err, collection) {
collection.remove({_id: '4d512b45cc9374271b00000f'});
});
Run Code Online (Sandbox Code Playgroud) 设置后useUnifiedTopology=true,自动重新连接停止工作并生成以下错误:
DeprecationWarning: The option `reconnectInterval` is incompatible with the unified topology
DeprecationWarning: The option `reconnectTries` is incompatible with the unified topology
DeprecationWarning: The option `autoReconnect` is incompatible with the unified topology
Run Code Online (Sandbox Code Playgroud)
我怎样才能让服务器自动重新连接那个新标志?
我正在使用mongoose.createConnection以下选项进行连接:
{
autoReconnect: true,
keepAliveInitialDelay: 300000,
connectTimeoutMS: 300000,
reconnectTries: Number.MAX_VALUE,
reconnectInterval: 1000,
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
poolSize: 10,
auth: {
authSource: "admin"
},
user: process.env.MONGO_USER,
pass: process.env.MONGO_PASS
}
Run Code Online (Sandbox Code Playgroud) 我在express.js应用程序中使用mongodb-native-driver.我在数据库中有大约6个集合,所以我创建了6个js文件,每个文件都有一个集合作为javascript对象(例如function collection(){}),原型函数处理这些集合上的所有操作.我认为这将是一个很好的架构.
但我遇到的问题是如何连接到数据库?我应该在每个文件中创建一个连接并使用它们吗?我认为这将是一种矫枉过正,因为mongodb-native-driver中的连接创建了一个连接池,并且其中有几个连接不合理.
那么如何创建单个连接池并在所有collections.js文件中使用它?我希望得到像在mongoose中实现的连接.如果我在应用程序架构中的任何思维过程都是错误的,请告诉我.
使用Mongoose可以解决这些问题,但我在几个地方读过它比本机驱动程序慢,而且我更喜欢无模式模型.
编辑:我用模型创建了一个模块.每个集合都在一个文件中,它将数据库作为参数.现在在index.js文件中,我调用数据库连接并在从连接获取数据库后保留变量db.(我使用了自动重新连接功能来确保连接没有丢失).在同一个index.js文件中,我像这样导出了每个集合
exports.model1 = require('./model1').(db)
exprorts.model2 = require('./model2').(db)
Run Code Online (Sandbox Code Playgroud)
这确保了数据库的一部分,在短短一个模块处理和应用程序只需调用每个model.js文件中导出函数一样save(),fincdbyid()等(whatever you do in the function is upto you to implement).
我们读取了一个xml-stream包含大约500k元素的XML文件(使用),并将它们插入到MongoDB中,如下所示:
xml.on(`endElement: product`, writeDataToDb.bind(this, "product"));
Run Code Online (Sandbox Code Playgroud)
插入writeDataToDb(type, obj)如下:
collection.insertOne(obj, {w: 1, wtimeout: 15000}).catch((e) => { });
Run Code Online (Sandbox Code Playgroud)
现在当Mongo连接断开连接时,xml流仍然会读取并且控制台充满了错误消息(无法插入,断开连接,EPIPE损坏,......).
在文档中它说:
当你关闭mongod进程时,驱动程序停止处理操作并继续缓冲它们,因为bufferMaxEntries默认为-1意味着缓冲所有操作.
这个缓冲区实际上做了什么?
我们注意到当我们插入数据并关闭mongo服务器时,事情得到缓冲,然后我们将mongo服务器重新启动,本机驱动程序成功重新连接,节点恢复插入数据但缓存的文件(在mongo beeing offline期间)不插入再次.
所以我质疑这个缓冲区及其用途.
目标:
我们正在寻找最好的方式(根据15000milliseconds保持刀片在缓冲区中,直到蒙戈回来wtimeout),并让然后将缓冲的文件或利用xml.pause();和xml.resume()我们尝试没有成功.
基本上我们需要一些帮助来处理如何在没有数据丢失或中断的情况下处理断开连接.
我正在尝试检查具有email提供的用户是否存在于集合中users,但我的函数对于每个调用都保持返回undefined.我使用es6并且async/await为了摆脱大量的回调.这是我的函数(它在一个类中):
async userExistsInDB(email) {
let userExists;
await MongoClient.connect('mongodb://127.0.0.1:27017/notificator', (err, db) => {
if (err) throw err;
let collection = db.collection('users');
userExists = collection.find({email: email}).count() > 0;
console.log(userExists);
db.close();
});
console.log(userExists);
return userExists;
}
Run Code Online (Sandbox Code Playgroud)
所以,调用console.log内部的第一个.connect总是返回,false因为返回的值.find不是数组,它是一个巨大的对象,如下所示:
{ connection: null,
server: null,
disconnectHandler:
{ s: { storedOps: [], storeOptions: [Object], topology: [Object] },
length: [Getter] },
bson: {},
ns: 'notificator.users',
cmd:
{ find: 'notificator.users',
limit: 0,
skip: 0,
query: …Run Code Online (Sandbox Code Playgroud) node.js ×8
mongodb ×7
javascript ×2
mongoose ×2
bluebird ×1
ecmascript-7 ×1
express ×1
promise ×1
pug ×1
reconnect ×1