如何在mongodb中使用mapReduce发出一个值数组?

如何在mongodb中使用mapReduce发出一个值数组?,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在尝试编写一个mapReduce查询,以查找每个制造商价格加里程值最低的汽车。我对这一点相当陌生,不知道如何释放一对值(即Milage和Price),然后将它们减少为一个值 var mapFunction = function () { var key = this._id; var values = [this.Milage, this.Price]; emit(key, values); }; //Reducing failes here! var reduceFuncti

我正在尝试编写一个mapReduce查询,以查找每个制造商价格加里程值最低的汽车。我对这一点相当陌生,不知道如何释放一对值(即Milage和Price),然后将它们减少为一个值

var mapFunction = function () {
  var key = this._id;
  var values = [this.Milage, this.Price];
  emit(key, values);
};

//Reducing failes here!
var reduceFunction = function (key, values) {
  let reducedValue = 0;
  values.forEach((num) => {
    reducedValue += parseFloat(num);
  });
  return reducedValue;
};

lowestValuePerManufacturer = async () => {
  const client = await MongoClient.connect(url, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  }).catch((err) => console.log("Could not connect to MongoDB", err));

  try {
    const db = client.db(dbName);
    const collection = db.collection(collectionName);
    //Query starts here!
    const res = await collection.mapReduce(mapFunction, reduceFunction, {
      out: { inline: 1 },
    });
    console.log(res);
  } catch (err) {
   ///
  }
};
数据是汽车对象的数组,如

{
    "Manufacturer": "Fiat",
    "Colour": "Black",
    "Model": "Panda",
    "Milage": 33292.0,
    "Price": 2668.32,
    "Classification": "Motor Cars",
    "Extras": [
        "SatNav",
        "ABS"
    ]
},

因此,我们的想法是使用聚合:

  • 首先使用操作员按制造商对文档进行分组
  • 然后使用运算符查找
    Price
    Milage
    之和的最小值
  • 请尝试以下查询:

    db.cars.aggregate([
    {
    $group:{
    _id:“$Manufacturer”,
    最低价格/里程:{
    $min:{
    $add:[“$Price”、“$Milage”]
    }
    }
    }
    },
    {
    $项目:{
    _id:0,
    制造商:“$\u id”,
    最低价格里程:$min价格里程
    }
    }
    ]);
    
    输出:

    /*1*/
    {
    “制造商”:“奥迪”,
    “最低价格/里程”:36020
    },
    /* 2 */
    {
    “制造商”:“现代”,
    “最低价格/里程”:22083
    }
    
    cars
    集合中的测试数据:

    [
    {
    “_id”:ObjectId(“…”),
    “制造商”:“现代”,
    “颜色”:“黑色”,
    “模型”:“重音”,
    “Milage”:29,
    “P15395ice”:1
    },
    {
    “_id”:ObjectId(“…”),
    “制造商”:“现代”,
    “颜色”:“红色”,
    “模型”:“场地”,
    “Milage”:33,
    “价格”:22050
    },
    {
    “_id”:ObjectId(“…”),
    “制造商”:“奥迪”,
    “颜色”:“蓝色”,
    “型号”:“Q3”,
    “Milage”:20,
    “价格”:36000
    },
    {
    “_id”:ObjectId(“…”),
    “制造商”:“奥迪”,
    “颜色”:“蓝色”,
    “型号”:“A4”,
    “Milage”:31,
    “价格”:40900
    }
    ]
    
    Hi。为什么需要映射/减少?当您可以按制造商分组数据并找到最低价格时。正如您在官方文档中所看到的,MongoDB鼓励您将聚合管道与
    $group
    一起使用,而不是映射/reduce:Hello@dheemanthb,这与我在此之后尝试使用$group的文档相同。你能告诉我如何使用聚合管道来实现我的目标吗?谢谢!我仍然会尝试使用map/reduce制作一个等价物,因为它属于我的作业。SheeshMongoDB免费检查这两道菜:1。2:是的,我想是这样的!再次感谢你