我有这个集合,其中的对象看起来像:
{
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件事:
- 在客户端对它们进行排序会更好吗?我试着把手机放在心上,所以,这样的排序会让页面需要几秒钟的加载时间,因为我有的不仅仅是这3种水果
- 有更好的排序查询可以使用吗?我对Mongo有点陌生
- 这只是一个普遍的坏主意吗
这目前正在客户端上使用,我可以将其移动到服务器,但它也告诉我使用了一个错误的排序规范。
$cond
运算符用于聚合,而不是使用.find
的简单查询。
Meteor本身使用NodeJS的MongoDB驱动程序,但不是直接使用(它将Mongo调用抽象到Meteor环境中(,所以不能只调用collection.aggregate
。
但是,您可以通过rawCollection
使用本机集合,然后手动处理所有异步操作(对于更有经验的用户(,也可以使用几个包中的一个进行适当的聚合,例如:
单个聚合:https://github.com/sakulstra/meteor-aggregate/
具有聚集性的出版物:https://github.com/robfallows/tunguska-reactive-aggregate/