Mongoose,简洁的方法将每个独特属性的一个项目放入一个数组中?

时间:2015-02-11 07:55:16

标签: node.js mongodb mongoose

我有一系列具有许多不同特征的文件。我想从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);
  });
});

2 个答案:

答案 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 );
    }
 });

Mongoose : Model aggregate

答案 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);
    ....  
});