我正在尝试在没有定义模型的情况下通过猫鼬查询MongoDB。
NoSQLBooster 中的此查询将生成正确的结果。
db.coins.find({ "serverTime" : { $gt : "1523441870", $lt : "1523441999"}});
--
下面的 find(( 将返回来自数据库的信息。但它不会从数据库返回预期的文档。它不会返回任何结果。
const db = myDB = mongoose.connect(keys.mongoURI, (err, db) => {
myDB = db;
});
db
.then(db => {
connection = mongoose.connection;
console.log('Mongodb has been connected', myDB);
//connection.collection("coins").find({ "serverTime" : { $gt : "1523441870", $lt : "1523441999"}}, function (err, info) {
connection.collection("coins").find({}, function (err, info) {
console.log("info: ", err);
console.log("info: ", info);
});
})
.catch(err => {
console.log('Error while trying to connect with mongodb');
throw err;
});
Cursor {pool: null, server: null, disconnectHandler: Store, bson: BSON, ns: "dev.coins", …}
index.js:29
_events:Object {}
_eventsCount:0
_maxListeners:undefined
_readableState:ReadableState {objectMode: true, highWaterMark: 16, buffer: BufferList, …}
bson:BSON {}
cmd:Object {find: "dev.coins", limit: 0, skip: 0, …}
cursorState:Object {cursorId: null, cmd: Object, documents: Array(0), …}
destroyed:false
disconnectHandler:Store {s: Object, length: <accessor>}
domain:null
logger:Logger {className: "Cursor"}
namespace:Object
ns:"dev.coins"
options:Object {readPreference: ReadPreference, skip: 0, limit: 0, …}
pool:null
readable:true
readPreference:ReadPreference
s:Object {numberOfRetries: 5, tailableRetryInterval: 500, currentNumberOfRetries: 5, …}
server:null
sortValue:undefined
topology:Server {domain: null, _events: Object, _eventsCount: 23, …}
__proto__:Readable {setCursorBatchSize: , cursorBatchSize: , setCursorLimit: , …}
当你在mongoose.connection.collection上调用方法时,你实际上是在访问mongoose依赖mongodb提供的本机驱动程序。该驱动程序的文档位于此处。
在此上下文中,.find(( 返回一个游标,该游标具有接受回调或返回承诺的 toArray 方法。
您可以将回调从.find()
调用移动到.toArray()
调用,如下所示:
connection.collection("coins").find({}).toArray(function (err, info) {
console.log("info: ", err);
console.log("info: ", info);
})
或者,您可以实现基于承诺的解决方案,如下所示:
let results = connection.collection("coins").find({}).toArray()
results.then(console.log).catch(console.error)
请记住,生成的数组将包含整个集合。随着集合随着时间的推移而增长,根据文档的数量及其大小,这可能会导致 node.js 堆空间不足并崩溃。
首先获取集合。照顾好toArray.then promise,它包含您正在寻找的信息。循环或对返回的信息执行所需的操作。
const db = myDB = mongoose.connect(keys.mongoURI, (err, db) => {
myDB = db;
});
db
.then(db => {
connection = mongoose.connection;
let collection = mongoose.connection.db.collection('coins');
console.log('Mongodb has been connected', myDB);
//Find the information
collection.find({ "serverTime" : { $gt : "1523441870", $lt : "1523441999"}}, function (err, info) {
//collection.find({}, function (err, info) {
console.log("info: ", err);
console.log("info: ", info);
//Convert to Array.
//The toArray will return a promise with the info you are looking for.
let array = info.toArray().then(info => {
console.log("more info: ", info[0]["serverTime"]);
});
console.log("info: ", array);
});
})
.catch(err => {
console.log('Error while trying to connect with mongodb');
throw err;
});