如何在Model.distinct()之后获取与不同值相关的所有字段

时间:2016-02-02 08:03:05

标签: node.js mongodb mongoose

我有这样的架构:

var PricelistSchema = new Schema({
  Category : String,
  Family: String,
  Others: String,
  Brand: String,
  Volume: Number,
  Price: Number,
  City: String
});

我使用Distinct values Family field方法得到Model.distinct()的{​​{1}}。但问题是我还需要知道具有每个不同家庭值的类别的相应值。

我试过mongoose,但我似乎无法获得正确的结果。有人可以帮助我吗,这非常重要。

示例输出:

MapReduce

我有近3000份这样的文件。我需要在数据库中只获取不同的系列名称,但每个系列名称都应该包含相关的类别。

现在我得到:

{
  "_id": "56af4c63ad0fd9ec149694d2",
  "Category": "Rum",
  "Others": "0",
  "Family": "Old Monk",
  "Brand": "OLD MONK WHITE RUM",
  "Volume": 375,
  "Price": 220,
  "City": "Delhi"
},
{
  "_id": "56af4c63ad0fd9ec149694d3",
  "Category": "Rum",
  "Others": "0",
  "Family": "Old Monk",
  "Brand": "OLD MONK WHITE RUM",
  "Volume": 750,
  "Price": 440,
  "City": "Delhi"
}

在数组中,我还需要每个字段的类别。 感谢

1 个答案:

答案 0 :(得分:1)

aggregation framework 非常适合这种情况,因为您需要使用 $group Family字段对文档进行分组>运算符并使用 $addToSet 累加器运算符创建一个数组,该数组包含每个分组文档的不同Category值。

聚合管道将包含以下操作步骤,以包含为 aggregate() 方法参数:

// Define the pipeline
var pipeline = [
    {
        "$group": {
            "_id": "$Family",
            "Categories": { "$addToSet": "$Category" }
        }
    }
];

// Run the pipeline
PriceList.aggregate(pipeline)
         .exec(function (err, result){
             if (err) { /* Handle error */};
             console.log(JSON.stringify(result, null, 4));
         });

或使用流畅的API运行管道:

PriceList.aggregate()
         .group({
             "_id": "$Family",
             "Categories": { "$addToSet": "$Category" }
         })
         .exec(function (err, result){
             if (err) { /* Handle error */};
             console.log(JSON.stringify(result, null, 4));
         });