我有一系列具有许多不同特征的文件。我想从Mongoose获取一个数组,其中数组中的每个项都是属性的唯一值,在本例中为color
。换句话说,我不想要每个项目的数组,只需要颜色值。所以在这种情况下,如果我有100种不同的产品,但在所有100种产品之间只有8种颜色,那么我希望拥有8种颜色的数组。这是我一直在使用的方式,但我想知道是否有更简洁的方法吗?
var allproducts = Products.find(function (err, products) {
// Get all products
var collection = [];
// Make an array to contain a product with each of the 8 colors
var uniqueArray = [];
// Make an array to check the current color against (if already used)
for (var i = products.length - 1; i >= 0; i--) {
if (uniqueArray.indexOf(products[i].color) === -1) {
// Check to see if the color is in the unique color array
uniqueArray.push(products[i].color);
// Add it if not
collection.push(products[i]);
// Add the product to the collection array if its color is not in the unique array
}
}
});
尝试使用Mongoose aggregate method
:
router.get('/', function (req, res) {
Products.aggregate([{
$group: {
_id: '$color'
}
}], {}, function (err, collection) {
console.log(err, collection);
if (err) {
throw err
}
res.end();
// res.json(collection);
});
});
答案 0 :(得分:1)
予。直接在mongodb,您必须要求:
db.colors.aggregate( { $group: {_id:"$color"} } )
结果:
{ "_id" : "yellow" }
{ "_id" : "blue" }
{ "_id" : "red" }
MongoDB Tutorial for aggregation
II。你可以在猫鼬中做到:
Products.aggregate(
{$group: {
_id: '$color' // grouping key - group by field district
}
}).exec( function( err, products ) {
if ( err ) {
return res.status( 400 ).send({
message: errorHandler.getErrorMessage( err )
});
} else {
res.json( products );
}
});
答案 1 :(得分:1)
使用lodash
可以轻松解决此问题npm install lodash --save
var _ = require('lodash');
var allproducts = Products.find(function (err, products) {
...
var uniqueArray = _.pluck(products, 'color');
uniqueArray = _.uniq(uniqueArray);
....
});