根据可能不存在的记录的嵌套字段对流星指针进行排序

Sorting a meteor pointer based on a record's nested field that may not exist

我有这个 collection,其中的 objects 看起来像:

{
  name: 'Apple',
  listOrder: {
    default: 1,
    wallmart: 1
  }
  color: 'Red'
},
{
  name: 'Orange',
  listOrder: {
    default: 2,
    wallmart: 3
  }
  color: 'Orange'
},
{
  name: 'Lemon',
  listOrder: {
    default: 3,
    wallmart: 2
  }
  color: 'Yellow'
}

我有 3 个水果摊需要按正确的顺序取回。 我已经尝试了几种不同的方法来做到这一点,我觉得我在正确的轨道上:

function getFruit(storeName){
  var override = {check:{}, sort:{}}
  override.check[`listOrder.${store}`] = {$exists:1}
  override.sort[`order.${store}`] = 1

  var sort = {sort:{$cond:{if:override.check, then:override.sort, else:{'listOrder.default':1}}}}

  return FruitsCollection.find({}, sort).fetch()
}

它告诉我 $cond 不是受支持的排序键。我想知道 3 件事:

  1. 在客户端对它们进行排序会不会优化得更好?我试图牢记移动设备,因此,像这样排序会使页面加载需要几秒钟,因为我拥有的不仅仅是这 3 种水果。
  2. 有没有更好的排序查询可供我使用?我对 Mongo 有点陌生。
  3. 这只是一个普遍的坏主意吗?

这目前正在客户端上使用,我可以将它移到服务器上,但它也告诉我我使用了错误的排序规范。

$cond operator is used in an aggregation, which is not a simple query 使用 .find

Meteor 本身使用 NodeJS 的 MongoDB 驱动程序但不是直接使用(它为您抽象了 Mongo 对 Meteor 环境的调用),所以您不能只调用 collection.aggregate.

但是,您可以使用 native collection via rawCollection 然后手动处理所有异步操作(对于更有经验的用户),或者使用几个包之一进行适当的聚合,例如:

单个聚合:https://github.com/sakulstra/meteor-aggregate/

聚合的出版物:https://github.com/robfallows/tunguska-reactive-aggregate/