模板助手中的异常:错误:匹配错误

时间:2016-06-03 00:18:32

标签: meteor minimongo

我正在尝试使用Meteor中模板助手内的比较器函数执行自定义排序。

这是我的模板助手:

Template.move_list.helpers({
  assets() {
    return Assets.find({}, { sort: sortFunction });
  }
});

这是比较器功能:

const sortFunction = function (doc1, doc2) {
  const barcodes = Session.get('barcodesArray');

  if (barcodes.indexOf(doc1.barcode) === -1 || barcodes.indexOf(doc2.barcode) === -1) {
    return 0;
  }

  let last = null;
  _.each(barcodes, function (barcode) {
    if (barcode === doc1.barcode) last = doc1.barcode;
    if (barcode === doc2.barcode) last = doc2.barcode;
  });

  return last === doc1.barcode ? 1 : -1;
}

错误

页面加载时,会返回以下错误:

Exception in template helper: Error: Match error: Failed Match.OneOf, Match.Maybe or Match.Optional validation

我在chrome中放入了一个断点sortFunction,但是函数从未进入过,断点从未到达。

当然,当我删除sort时,错误不会被抛出。

参考

此功能没有很好的记录,但这里是relevant part of the docs

  

对于本地集合,您可以传递一个接收两个文档对象的比较器函数,如果第一个文档按顺序排在第一个文档,则返回-1;如果第一个文档第一个文件,则返回1;如果两个文档都不在另一个文档之前,则返回0。这是MongoDB的Minimongo扩展。

commit by mitar添加了功能,以及测试中的示例代码:

var sortFunction = function (doc1, doc2) {
  return doc2.a - doc1.a;
};
     

c.find({}, {sort: sortFunction})

任何人都可以理解这个错误吗?

1 个答案:

答案 0 :(得分:0)

修改

此问题应在Meteor> = v1.3.3.1。

中解决

本地集合(即客户端和内存服务器端集合)将允许将函数作为sort子句传递。

错误来自mongo包,其中规范不允许sort成为函数。

@mitar在LocalCollection包中更改了minimongoLocalCollection是客户端上Mongo.Collection对象的一部分(其_collection属性),但仍会根据原始mongo规范检查查询。 我认为这是一个错误,因为规范未更新以反映更改。

要克服这个问题(在此期间),要么让函数接受一个子字段,这样sort值就是一个对象:

var sortFunction = function (x, y) {
  return x - y;
};
c.find({}, {sort: {a: sortFunction}});

或使用c._collection.find()代替,这将起作用(据我所知),除非它不会应用为集合定义的任何转换。

var sortFunction = function (doc1, doc2) {
  return doc2.a - doc1.a;
};
c._collection.find({}, {sort: sortFunction});