我需要在流星中准确地使用这个map / reduce函数: http://cookbook.mongodb.org/patterns/count_tags/
阅读所有条目中的所有标记,并返回一个包含集合中数量的唯一标记列表
我将如何实现这一点。我正在使用独立的Mongodb。 集合布局:
[_id] => 1234
[headline] => My First Post
[body] => Alot of stuff
[isPrivat] =>
[tags] => Array (
[0] => test
[1] => php
[2] => perl
)
我发现了这个问题/答案,但我无法做到这一点我做的事情:
Does Meteor have a distinct query for collections?
最优雅的方法是什么? 谢谢你的时间
答案 0 :(得分:8)
目前,最优雅的解决方案是aggregation framework:
db.items.aggregate(
{ $unwind : "$tags" },
{ $group : {
_id : "$tags",
count: { $sum : 1 }
}}
);
它将输出如下结果:
{ "result" : [
{ "_id" : "perl",
"count" : 2 },
{ "_id" : "php",
"count" : 1 },
{ "_id" : "test",
"count" : 1 }],
"ok" : 1 }
这是mongodb shell语法。我不熟悉meteor,所以我不会尝试编写一些代码。希望这有帮助!
答案 1 :(得分:2)
您可以尝试使用meteor-mongo-extensions智能包,它实现了Meteor的一些MongoDB聚合框架功能(免责声明:我自己没有尝试过)。
您可能会发现有用的另一种解决方案是pull request #644草图。
答案 2 :(得分:1)
我使用a.js lib从这里建议了不同的代码搜索。 Does Meteor have a distinct query for collections?
这个丑陋的人:
Template.Tag.taglist = function () {
var taglist = Posts.find({}).distinct("tags");
taglist = _.compact(_.flatten(_.pluck(taglist, 'tags')));
// reformat, count and filter doublets
function counttags(arr) {
var a = [], b = [], prev;
arr.sort();
for ( var i = 0; i < arr.length; i++ ) {
if ( arr[i] !== prev ) {
a.push(arr[i]);
b.push(1);
} else {
b[b.length-1]++;
}
prev = arr[i];
}
result = _.zip(a,b);
return result;
}
var taglist = counttags(taglist);
//console.log(taglist);
return taglist;
};
和(简化)模板:
<template name="Tag">
{{#each taglist}}
{{this.[0]}}x {{this.[1]}}
{{/each}}
</template>
它不是很漂亮。一旦聚合或map / reduce方法可用,我将交换代码。但是对于原型设计来说这是有效的。感谢大家。