现在,父for循环(m < repliesIDsArray.length)在第一个findOne触发之前完成,所以这只遍历repliesIDsArray..asynchronous的最后一个元素.
这个代码集的promisified版本的正确语法是什么?是新的promisification,并想知道如何启动这个promisify +循环通过数组+帐户的if语句..
蓝鸟是必需的,并被Promise.promisifyAll(require("mongoose"));称为.
for(var m=0; m<repliesIDsArray.length; m++){
objectID = repliesIDsArray[m];
Models.Message.findOne({ "_id": req.params.message_id},
function (err, doc) {
if (doc) {
// loop over doc.replies to find the index(index1) of objectID at replies[index]._id
var index1;
for(var i=0; i<doc.replies.length; i++){
if (doc.replies[i]._id == objectID) {
index1 = i;
break;
}
}
// loop over doc.replies[index1].to and find the index(index2) of res.locals.username at replies[index1].to[index2]
var index2;
for(var j=0; j<doc.replies[index1].to.length; j++){
if (doc.replies[index1].to[j].username === res.locals.username) {
index2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试检查具有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) 当编译任何只导入的 typescript 程序时mongodb,我收到 12 个错误,例如:
node_modules/mongodb/mongodb.d.ts:3309:5 - error TS2416: Property 'end' in type 'GridFSBucketWriteStream' is not assignable to the same property in base type 'WritableStream'
Run Code Online (Sandbox Code Playgroud)
使用节点 TLS (v16.13.1) 和一个空目录来重现很简单,只需运行:
npm i mongodb typescript
echo "import mongodb from 'mongodb'" > index.ts
npx tsc index
Run Code Online (Sandbox Code Playgroud) 我只是在学习nodejs的mongodb-native驱动程序.
我这样连接.
var mongo=require("mongodb")
var serv=mongo.Server("localhost", 27017)
var dbase=mongo.Db("MyDatabase", serv)
Run Code Online (Sandbox Code Playgroud)
这很有效.但是,如果我尝试使用相同的服务器创建新的数据库连接,我会收到错误.
var dbase2=mongo.Db("MyDatabase2", serv)
Run Code Online (Sandbox Code Playgroud)
"错误:无法跨多个Db实例共享服务器或ReplSet实例"
但是如果首先建立新的服务器连接,它就可以工作.
var serv2=mongo.Server("localhost", 27017)
var dbase2=mongo.Db("MyDatabase2", serv2)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么有2个连接函数,一个用于Server,一个用于Db,当它们似乎必须一起使用时?
为什么不这样.
var dbase=mongo.Db("localhost", 27017, "MyDatabase")
Run Code Online (Sandbox Code Playgroud)
我想创建自己的功能,但是我想知道是否有其他原因它们是分开的.
谢谢.
场景:考虑我正在调用一个集合MyCollection,其中包含以下数据:
{
"_id" : 'MyUniqueID_01'
"CreatedTime" : "2013-12-01T14:35:00Z",
"LastModifiedTime" : "2013-12-01T13:25:00Z"
}
Run Code Online (Sandbox Code Playgroud)
现在我想查询MongoDB数据库,其中上述类型的数据存在于大量文档中.而我的查询使用基于日期范围,即$gt,$gte,$lt和$lte
所以我的查询可能是这样的:
db.MyCollection.find({ 'CreatedTime': {$gt: '2013-05-25T09:29:40.572Z'}})
Run Code Online (Sandbox Code Playgroud)
考虑到上述示例预期结果,查询必须获取文档(因为"CreatedTime":"2013-12-01T14:35:00Z"大于查询中传递的值'2013-05-25T09:29:40.572 Z'); 但事实并非如此,问题是该字段CreatedTime是字符串格式.
问题:有没有什么方法可以在不更改字符串字段类型的情况下完美地获得我期望的结果?
我总是连接到"admin"DB,这是一个固定的bug.
使用Mongoose 5.0.6 MongoDb 3.6并尝试连接到Atlas.
干杯
如何从nodeJS的mongodb本机驱动程序中获取没有数据库名称的集合名称?
db.collectionNames(function(err, collections) {
if (err) {
log.error(err);
} else {
log.info(collections);
}
});
Run Code Online (Sandbox Code Playgroud)
此代码返回如下内容:
databaseName.collection1,databaseName.collection2,databaseName.collection3
但我想得到名字: collection1, collection2, collection3
所以.我有一个非常基本的脚本,它连接到一个数据库,并find在一个包含大量文档的集合上执行,并将其限制为3个项目.一切都顺利进行,除了在我的结果结束时,a null和脚本没有终止,而是在成功后悄然关闭连接.
在这里,我声明我的参数并创建我的数据库对象:
var SERVER = 'localhost',
PORT = 27017,
DATABASE = 'test',
COLLECTION = 'coll',
mongo = require('mongodb'),
db = new mongo.Db(DATABASE,
new mongo.Server(SERVER, PORT, {auto_reconnect: true}),
{});
Run Code Online (Sandbox Code Playgroud)
在这里,我连接到数据库并继续使用find游标和each函数查询它:
db.open(function(err, db) {
if(err) throw err;
var collection = new mongo.Collection(db, COLLECTION),
cursor = collection.find({}, {}).limit(3);
cursor.each(function(err, doc) {
if(err) throw err;
console.log(doc);
});
db.close();
});
Run Code Online (Sandbox Code Playgroud)
结果很好:
{ _id: '1',
a: 'first object' }
{ _id: '2',
a: 'second object' }
{ _id: …Run Code Online (Sandbox Code Playgroud) 当nodejs和mongodb服务器之间的连接丢失时,我试图得到"连接丢失"或类似的东西.我使用本机驱动程序并具有以下代码
var mongo = require('mongodb');
var server = new mongo.Server('host', 'port', {
auto_reconnect: true,
socketOptions: {
keepAlive: 10,
connectTimeoutMS: 1000,
socketTimeoutMS: 0
}
});
var db = new mongo.Db(
'dbname',
server,
{
w: 1,
wtimeout: 1000,
numberOfRetries: 100,
auto_reconnect: true
}
);
db.on('close', function () {
console.log('Error...close');
});
db.on('error', function (err) {
console.log('Error...error', err);
});
db.on('disconnect', function (err) {
console.log('Error...disconnect', err);
});
db.on('disconnected', function (err) {
console.log('Error...disconnected', err);
});
db.on('parseError', function (err) {
console.log('Error...parse', err);
});
db.on('timeout', function (err) { …Run Code Online (Sandbox Code Playgroud) 我希望使用以下方法计算我的文档:
db.collection('posts').count()
但是,我渐渐衰弱了:
DeprecationWarning:collection.count已弃用,将在以后的版本中删除.请改用collection.countDocuments或collection.estimatedDocumentCount
这是我的mongodb nodejs驱动程序版本:
"dependencies": {
"mongodb": "^3.1.0"
},
"devDependencies": {
"@types/mongodb": "^3.1.0",
"chai": "^4.1.2",
"mocha": "^5.1.1",
"ts-node": "^7.0.0",
"tslint": "^5.10.0",
"typescript": "^2.9.2"
}
Run Code Online (Sandbox Code Playgroud)
没有countDocuments或estimatedDocumentCount在index.d.ts文件中.
我该如何解决这个警告?
mongodb ×8
node.js ×7
javascript ×3
mongoose ×2
bluebird ×1
bson ×1
connection ×1
ecmascript-7 ×1
json ×1
promise ×1
timeout ×1
typescript ×1