【问题标题】:Mongoose find returning odd object猫鼬发现返回奇怪的对象
【发布时间】:2015-11-06 13:20:14
【问题描述】:

我当前的问题是 db.collection.find() mongoose 命令。我对 mongoose/mongodb 比较陌生,但我已经掌握了它的概念。这是我一直在尝试运行的测试代码:

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() 函数的代码有什么问题?解释为什么当前的数据检索错误也会很好。

感谢您的帮助!

【问题讨论】:

  • 这是因为您从本机驱动程序返回了数据库对象。它返回一个“光标”,即您所说的“奇数对象”。您可能需要 mongoose 模型方法。
  • 对于 Mongoose 和 native-mongodb-driver 而言,这是非常糟糕的文档。浪费 3 个小时做错误的事情,因为他们在多个地方都有不良信息。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

您收到的对象是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 模型对象的方法。

【讨论】:

  • 感谢您的回复!我不知道 Cursors 不会返回多个对象。我尝试运行 to.Array() 以从函数返回,但它总是返回“MongoError:回调是必需的”错误。当我在*中添加回调时,它似乎永远不会进入。这是我收藏的问题吗?还是代码有问题
  • 我发现错误是数组的存储空间太大,所以它正在崩溃我的代码或其他东西。将其限制为 X 查询限制后,它可以工作。谢谢!!由于架构是动态的,因此该测试当前使用本机驱动程序。我还没有想出/研究一种查询动态模式查询的方法。感谢您的帮助!
  • @erics 处理大型数据集,您可以在其回调中使用cursor.batchSize 然后cursor.each。这将分批加载文档。
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
相关资源
最近更新 更多