2015-08-13 2 views
1

моя текущая проблема с командой db.collection.find() mongoose. Я относительно новичок в mongoose/mongodb, но я понял, что это такое. Вот тестовый код, который я пытался запустить:Mongoose найти возвращающийся нечетный объект

mongoose.connect(url); 
function main() 
{ 
    var db = mongoose.connection; 
    db.on('open', function() { 

     db.collection('Tweet').find({id: 631460910368956400}, function (err, data){ 
      console.log(data); 
     }) 


     /*var coll = db.collection('Tweet'); 
     db.collection('Tweet').findOne({id: 631460910368956400},function (err, ret) { 
      if(err) console.log(err); 
      console.log(ret['id']); 

     //db.close(); 
     });*/ 
    }); 
} 
main(); 

Данные, возвращаемые из закомментированного поля, не является странным объектом:

{ connection: null, 
    server: null, 
    disconnectHandler: 
    { s: { storedOps: [], storeOptions: [Object], topology: [Object] }, 
    length: [Getter] }, 
    bson: {}, 
    ns: 'TEST.Tweet', 
    cmd: { find: 'TEST.Tweet', limit: 0, skip: 0, query: {}, slaveOk: false }, 
    options: 
    { skip: 0, 
    limit: 0, 
    raw: undefined, 
    hint: null, 
    timeout: undefined, 
    slaveOk: false, 
    db: 
     { domain: null, 
     _events: [Object], 
     _maxListeners: undefined, 
     s: [Object], 
     serverConfig: [Getter], 
     bufferMaxEntries: [Getter], 
     databaseName: [Getter], 

и т.д. и т.п ... это продолжается в течение намного длиннее.

IP-адрес - это удаленное соединение, которое успешно соединяется. Я могу делать такие вещи, как добавление и удаление документов, но не могу фактически просмотреть документы из javascript. Я знаю, что это вызвано какой-то асинхронной проблемой, однако я не уверен, как ее исправить. Кроме того, прокомментированный код для .findOne(), похоже, полностью выводит данные в коде выше.

В чем проблема с кодом функции .find()? Объяснение того, почему текущая ошибка при извлечении данных также будет полезна.

Благодарим за помощь!

+0

Это потому, что вы вернули объект базы данных из родного драйвера. Он возвращает «курсор», который является «нечетным объектом», о котором вы говорите. Вы, вероятно, хотите использовать методы модели мангуста. –

+0

Это невероятно плохой документ со стороны Mongoose и native-mongodb-driver. Потратьте 3 часа на то, чтобы делать неправильные вещи, потому что у них плохая информация в нескольких местах. – Leon

ответ

3

Объект, который вы получаете, это Cursor, который является объектом, используемым для получения фактических результатов.

Если вы уверены, что ваш запрос никогда не вернет больше одного объекта (например, в этом случае, когда вы запрашиваете всегда уникальное поле _id), вы можете использовать db.collection('Tweet').findOne(, который вернет именно этот объект без дополнительного слоя косвенности.

Но когда ваш запрос может потенциально вернуть более одного документа, вам нужно использовать курсор. Чтобы устранить курсор, вы можете превратить его в массив документов с помощью cursor.toArray:

db.collection('Tweet').find({}, function (err, cursor){ 
     cursor.toArray().forEach(function(doc) { 
      console.log(doc); 
     }); 
    }) 

Это самый простой вариант. Дополнительные сведения о курсорах см. В документации, приведенной выше.

Кстати: До сих пор вы использовали только функциональность родного драйвера. Если вы хотите использовать Mongoose для запроса объектов, вы можете использовать методы объекта модели Mongoose.

+0

Спасибо за ваш ответ! Я не знал, что курсоры не возвратят несколько объектов. Я попытался запустить to.Array() для возврата из функции, однако он всегда возвращается с ошибкой «MongoError: Callback is required». Когда я добавляю обратный вызов в *, он никогда не заходит внутрь. Это проблема с моей коллекцией? или это будет проблема с кодом –

+0

Я узнал, что ошибка заключалась в том, что хранилище для массива было слишком большим, так что это сбой моего кода или что-то в этом роде. После того, как он ограничивает ограничение на количество запросов X, он работает. Благодаря!! Этот тест в настоящее время использует собственный драйвер из-за того, что схемы являются динамическими. Мне еще предстоит выяснить/исследовать способ запроса динамических схем. Спасибо за вашу помощь! –

+0

@erics для обработки больших наборов данных, вы можете использовать 'cursor.batchSize', а затем' cursor.each' в своем обратном вызове. Это будет загружать документы меньшими партиями. – Philipp