Найти значения, используя коллекцию, а не модель в мангусте

Я пытаюсь запросить 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: , …}

info - это объект Курсор. Вам нужно вызвать toArray(callback) на нем, чтобы получить все результаты в виде массива.

S.D. 11.04.2018 14:09

отлично! Но как мне продолжить изучение? Promise {pending} index.js: 32 [[PromiseStatus]]: "разрешено" [[PromiseValue]]: длина массива (3): 3 прото: массив (0) [,…] 0: объект {_id: ObjectID, serverTime : «1523441876», BTC: Object,…} 1: Object {_id: ObjectID, serverTime: «1523441882», BTC: Object,…} 2: Object {_id: ObjectID, serverTime: «1523441888», BTC: Object,… }

user2130951 11.04.2018 14:24
toArray() возвращает Promise. Узнайте больше о асинхронная логика и повторно посетите документы драйвера mongodb, это будет намного понятнее.
S.D. 11.04.2018 14:45
3
3
2 040
2

Ответы 2

Сначала получите коллекцию. Позаботьтесь о обещании toArray.then, которое содержит информацию, которую вы ищете. цикл или делайте что хотите с возвращенной информацией.

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;
});

Когда вы вызываете методы в mongoose.connection.collection, вы фактически получаете доступ к собственному драйверу, на который полагается mongoose, предоставленный mongodb. Документация для этого драйвера существует здесь.

.найти() в этом контексте возвращает курсор, который имеет 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 не хватит места в куче и произойдет сбой.

Другие вопросы по теме