如何避免Meteor应用程序中mongoDb中的重复条目。
命令:db.products.find({},{"TEMPLATE_NAME": 1},{unique : true})
{ "_id" : ObjectId("5555d0a16ce3b01bb759a771"), "TEMPLATE_NAME" : "B" }
{ "_id" : ObjectId("5555d0b46ce3b01bb759a772"), "TEMPLATE_NAME" : "A" }
{ "_id" : ObjectId("5555d0c86ce3b01bb759a773"), "TEMPLATE_NAME" : "C" }
{ "_id" : ObjectId("5555d0f86ce3b01bb759a774"), "TEMPLATE_NAME" : "C" }
{ "_id" : ObjectId("5555d1026ce3b01bb759a775"), "TEMPLATE_NAME" : "A" }
{ "_id" : ObjectId("5555d1086ce3b01bb759a776"), "TEMPLATE_NAME" : "B" }
我想只检索唯一的模板名称并在HTML页面上显示它们。
答案 0 :(得分:5)
使用 aggregation framework ,其中您的管道阶段分别由$group
和$project
运算符组成。 $group
运算符步骤按给定键对输入文档进行分组,从而在结果中返回不同的文档。然后,$project
运算符会重新整形流中的每个文档,例如添加新字段或删除现有字段:
db.products.aggregate([
{
"$group": {
"_id": "$TEMPLATE_NAME"
}
},
{
"$project": {
"_id": 0,
"TEMPLATE_NAME": "$_id"
}
}
])
结果:
/* 0 */
{
"result" : [
{
"TEMPLATE_NAME" : "C"
},
{
"TEMPLATE_NAME" : "A"
},
{
"TEMPLATE_NAME" : "B"
}
],
"ok" : 1
}
然后,您可以使用 meteorhacks:aggregate package 在Meteor中实现聚合:
使用
添加到您的应用中meteor add meteorhacks:aggregate
然后只需使用 .aggregate
功能,如下所示。
var products = new Mongo.Collection('products');
var pipeline = [
{
"$group": {
"_id": "$TEMPLATE_NAME"
}
},
{
"$project": {
"_id": 0,
"TEMPLATE_NAME": "$_id"
}
}
];
var result = products.aggregate(pipeline);
- 更新 -
不使用聚合的替代方法是使用 underscore 的方法从集合的find方法返回不同的字段值,如下所示:
var distinctTemplateNames = _.uniq(Collection.find({}, {
sort: {"TEMPLATE_NAME": 1}, fields: {"TEMPLATE_NAME": true}
}).fetch().map(function(x) {
return x.TEMPLATE_NAME;
}), true)
这将返回一个包含不同产品模板名称["A", "B", "C"]
您可以查看一些详细解释上述方法的教程: Get unique values from a collection in Meteor 和 METEOR – DISTINCT MONGODB QUERY。
答案 1 :(得分:4)