【问题标题】:Why does my Collection.find().count() always returns 0 at client?为什么我的 Collection.find().count() 在客户端总是返回 0?
【发布时间】:2015-09-23 12:17:14
【问题描述】:

我有一个包含 170 万个文档的集合。在服务器端控制台上执行count() 时,我得到了正确的结果。

meteor:PRIMARY> db.postcodes.find().count();
1737697
meteor:PRIMARY>

而在浏览器控制台中,count() 总是为零,findOne() 返回 undefined

insecure 包尚未删除。 count()findOne() 正在为其他较小的 Collections 工作。目前没有太多代码。除了默认的html、js、css。只有几行代码存在。我有model.js 住在它自己的文件夹中(既不在服务器也不在客户端)有

PostCodes = new Mongo.Collection('postcodes');
Hello = new Mongo.Collection('hello');

我目前所有的收藏都是

meteor:PRIMARY> db.getCollectionNames();
[
        "hello",
        "meteor_accounts_loginServiceConfiguration",
        "parttimejobs",
        "postcodes",
        "system.indexes",
        "users"
]
meteor:PRIMARY>

我的包是

autopublish                  1.0.3  
ian:accounts-ui-bootstrap-3  1.2.69  
insecure                     1.0.3  
meteor-platform              1.2.2  
twbs:bootstrap               3.3.5  

示例文档

meteor:PRIMARY> db.postcodes.findOne();                 
{                                                       
        "_id" : ObjectId("559933dc4a8617644069fa5b"),   
        "postcode" : "AB10 1AB",                        
        "latitude" : 57.149079,                         
        "longitude" : -2.096964,                        
        "county" : "",                                  
        "district" : "Aberdeen City",                   
        "ward" : "George St/Harbour",                   
        "constituency" : "Aberdeen North",              
        "loc" : [                                       
                -2.096964,                              
                57.149079                               
        ]                                               
}                                                       

【问题讨论】:

  • 不看代码无从得知。
  • 我已经用所有集合和 model.js 更新了我的问题
  • 您是否删除了自动发布包??
  • 我还没有创建频道。所以,自动发布仍然存在。
  • 当客户端还没有收集时,您可能会要求计数,您必须在路由中创建一些 waitOn 函数等待收集准备好

标签: mongodb meteor


【解决方案1】:

假设您在应用启动时很早就尝试执行count(),那么数据似乎还没有准备好(由于需要加载大量数据)。

如果您只需要计数,我建议您使用 Meteor 方法并异步获取计数,这样您就不必等待客户端订阅为 170 万个文档做好准备。

下面是一个方法的例子:

在服务器上:

Meteor.methods({
  getSomeCollectionCount: function () {
    return someCollection.find().count();
  }
});

然后在客户端上:

Meteor.call('getSomeCollectionCount', function (error, result) {
  if(!error) {
    // add code to be run when count is ready

    console.log('someCollection count: ', result);
  }
});

另一种方法是使用 pub-sub 或 iron router waiton,但如果您只是想获得计数,我不建议客户端订阅所有 170 万个文档。

【讨论】:

    【解决方案2】:

    正如许多人提到的,这是由于数据量大。移除自动发布并创建频道后返回预期结果。

    Meteor.publish('postCodesChannel', function(){
        return PostCodes.find({postcode: {$regex: /B14 6B[DE]/}});
    });
    

    浏览器控制台现在返回适当的值

    >PostCodes.find().count();
    2
    

    【讨论】:

    • 因此,提示:不要在每次页面加载时发送千兆字节的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多