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



我有这个集合,其中的对象看起来像:

{
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'
}

我有三个水果摊,需要把它们按正确的顺序拿回来。我尝试了几种不同的方法来做到这一点,我觉得我走在了正确的轨道上:

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运算符用于聚合,而不是使用.find的简单查询。

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

但是,您可以通过rawCollection使用本机集合,然后手动处理所有异步操作(对于更有经验的用户(,也可以使用几个包中的一个进行适当的聚合,例如:

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

具有聚集性的出版物:https://github.com/robfallows/tunguska-reactive-aggregate/