【问题标题】:Limit Query in publication限制发布中的查询
【发布时间】:2017-08-11 21:37:51
【问题描述】:

您好,我正在尝试实现自己的分页,但在尝试限制发布查询时出现以下错误。

来自子产品 id Xbd4EW32oob8fBPkk 的异常错误:必须使用 带有跳过或 限制

Meteor.publish('Products', function(user, options) {
            if (organization && organization.categories) {
                //find products in array of categories
                let products = Products.find({
                                categories: {
                                        '$in': organization.categories
                                }                    
                            },
                            {limit: 10}
                            );
                return products;
            } else {
                return [];
            }
        });

订阅代码:

Router.route('/products', {
    name: 'products',
    loadingTemplate: 'loading',

    waitOn: function() {
        // return one handle, a function, or an array
        return Meteor.subscribe('Products', {limit: 10});
    },

    data: function () {
        return Products.find({});
    },

    action: function() {
        this.render('ProductCatalog');
    }

});

完整的错误跟踪:

I20170320-16:29:58.231(0)? Exception from sub Products id vDz4GLRXJ6s3cENeE Error: must use ordered observe (ie, 'addedBefore' instead of 'added') with skip or limit
I20170320-16:29:58.233(0)?     at [object Object]._.extend.observeChanges (packages/minimongo/minimongo.js:325:13)
I20170320-16:29:58.234(0)?     at [object Object].<anonymous> (packages/omknee:sales-process/sales-process.js:38:31)
I20170320-16:29:58.235(0)?     at [object Object]._handler (packages/omknee:access-control/access-control.js:38:31)
I20170320-16:29:58.236(0)?     at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1737:12)
I20170320-16:29:58.236(0)?     at [object Object]._.extend._runHandler (packages/ddp-server/livedata_server.js:1035:17)
I20170320-16:29:58.237(0)?     at [object Object]._.extend._startSubscription (packages/ddp-server/livedata_server.js:853:9)
I20170320-16:29:58.238(0)?     at [object Object]._.extend.protocol_handlers.sub (packages/ddp-server/livedata_server.js:625:12)
I20170320-16:29:58.239(0)?     at packages/ddp-server/livedata_server.js:559:43
I20170320-16:29:58.246(0)? Auth Strategy - Local. User : {"user":{"email":"laetitia.mendes@omknee.com"},"password":{"digest":"5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8","algorithm":"sha-256"}}

【问题讨论】:

  • 看起来你正在某个地方的光标上使用observe。您也可以发布该代码吗?
  • @jordanwillis 我没有在我的应用程序的任何地方使用观察
  • 你用的是什么版本的流星?
  • 1.4.3.2 @jordanwillis
  • $elemMatch 和 $in 的组合在我看来很奇怪。你能用 $in 试试吗?

标签: meteor publish-subscribe meteor-blaze


【解决方案1】:

您是否可以将sort 添加到您的查找选项中(通常limitsort 一起使用)。这就是我提出此建议的原因。

当您发布游标时,Meteor 会自动在该查询上设置observe,以便可以将更改发送给订阅者。但是,当查询被排序时,meteor 会自动设置一个observeChanges。我认为这种差异是导致错误的原因。 Meteor 使用了“observe”而不是“observeChanges”。

我看到关于这种情况的一些问题已记录到流星(例如#2766#1643),但我没有看到任何解决方案。

添加sort 选项的另一个原因是Meteor won't be able to use the oplog for this query

如果您的查询有限制但没有排序说明符,则您的查询无法利用 oplog

话虽如此,我无法确定确切您收到错误的原因,但鉴于上述情况,我猜这就是正在发生的事情。

【讨论】:

  • 我在使用以下选项时遇到了同样的错误 { sort: { name: 1 }, limit: 10 }
  • 嗯...让我在本地尝试一些东西,看看我是否能解决这个问题。
  • @MMrj 你能贴出packages/omknee:sales-process/sales-process.js的代码吗?
  • 我很难过。我直接在我的应用程序以及我的应用程序使用的包中测试了这个(在出版物中的查询中添加limit 选项)并且它没有问题。您的项目和我的项目之间唯一不同的变量是我没有使用 IronRouter,而是直接在我的模板中订阅该出版物。也许 IronRouter 正试图以中介的身份观察您的订阅并导致问题?尝试将您的订阅直接移动到您的模板中,看看是否能解决问题。
  • 感谢您的所有帮助,我找到了可以解决问题的解决方法。我还在meteor github上创建了一个issue,以便他们进一步分析这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多