2015-06-27 54 views
0

在我的收藏,每个文档有看起来像这样的两个值:如何根据两个字段的差异对集合进行排序?

{ 
    originalPrice: 500, 
    ourPrice: 420 
} 

正如你可以想像,我希望用户能够通过多少,他们会从我们这里,而不是节省购物排序从竞争对手中,在这个特别的好是80

但是,该值本身不是在数据库中,所以我不能简单地做

Goods.find({}, {sort: saveAmount: 1}) 

或类似的东西。

将这个数字插入数据库可能是一件容易的事情,但除非以其他方式让事情工作的方法非常复杂,否则我宁愿不这样做。

所以我想一个函数,这样做,

var saveAmount = function(originalPrice, ourPrice) { 
    return originalPrice - ourPrice 
} 

并以某种方式使用这个值来排序!

我该怎么做?

+2

你有看着使用[聚合](http://docs.mongodb.org/manual/aggregation/)? –

+0

@JasonCust不,第一次听说它! – Yeats

+0

您是否试过[Map-reduction](http://docs.mongodb.org/manual/core/map-reduce/)? – Alp

回答

1

你可以在MongoDB查询中完成,但不能用流星。因此,您必须按照您的建议使用单独的字段。这里是你可以做什么:

function setDifference (doc) { 
    var difference = doc.originalPrice - doc.ourPrice 
    Goods.update(doc._id, { $set: { difference: difference } }) 
} 

Goods.find().observe({ 
    added: setDifference, 
    updated: setDifference 
}) 

如果使用的是简单的模式,你可以使用autoValue

... 
difference: { 
    type: Number, 
    autoValue: function() { 
    return this.field('originalPrice').value - this.field('ourPrice').value 
    } 
} 
... 

反正现在你可以排序difference

Goods.find({}, {sort: {difference: -1}}) 
1

这里是你如何能显示在有序的商品在客户端上的例子:

JS

Template.myTemplate.helpers({ 
    sortedGoods: function() { 
    return _.sortBy(Goods.find().fetch(), function(good) { 
     return good.originalPrice - good.ourPrice; 
    }); 
    } 
}); 

HTML

<template name="myTemplate"> 
    {{#each sortedGoods}} 
    <div class="good">{{name}}: ${{ourPrice}}</div> 
    {{/each}} 
</template> 
+0

不知道我会如何使用这个帮手!另外,如果出现问题,我在出版物中使用了“限制”。 – Yeats

+0

是的,这是一个不错的解决方案,但出于显而易见的原因,它与出版物上的“限制”一起发挥不佳。同样的事情将不得不在服务器上完成。 – Yeats

+0

这很有道理。这是我在上面的问题中想要了解的。如果您需要了解发布时的差异,则应将其存储为单独的字段。这是唯一有效的解决方案。 –

相关问题