【问题标题】:Mongo query fields and return no duplicatesMongo 查询字段并且不返回重复项
【发布时间】:2020-03-22 16:20:26
【问题描述】:

我们如何在 mongo 中查询我们可以过滤字段以便没有字段重复?原因正如您在“Make”下面的结果中看到的那样:“Ford”返回了 3 次。

查询

Vehicle.model.find(query, { 'Year': 1, 'Make': 1, 'Model': 1 }).exec(function (err, vehicle) { 如果(错误 || !车辆){ 返回 res.json({ 消息:错误 }) }

return res.status(200).send({
    message: "success",
    data: vehicle,
    totalVehicle: vehicle.length,
})

})

样本结果

{
    "message": "success",
    "data": [
        {
            "_id": "5dde068b8911713924be68e7",
            "Make": "Ford",
            "Model": "Fusion",
            "Year": 2017
        },
        {
            "_id": "5dde068b8911713924be68f6",
            "Make": "Chevrolet",
            "Model": "Silverado 1500",
            "Year": 2017
        },
        {
            "_id": "5dde068b8911713924be6901",
            "Make": "Nissan",
            "Model": "Sentra",
            "Year": 2017
        },
        {
            "_id": "5dde068b8911713924be6908",
            "Make": "Ford",
            "Model": "Fusion",
            "Year": 2017
        },
        {
            "_id": "5dde068b8911713924be690b",
            "Make": "Ford",
            "Model": "F-150",
            "Year": 2017
        },
        {
            "_id": "5dde068b8911713924be690c",
            "Make": "Ford",
            "Model": "Super Duty F-250 SRW",
            "Year": 2017
        },
        {
            "_id": "5dde068b8911713924be690e",
            "Make": "Kia",
            "Model": "Sorento",
            "Year": 2017
        },
        {
            "_id": "5dde068b8911713924be6913",
            "Make": "Dodge",
            "Model": "Grand Caravan",
            "Year": 2017
        }
    ],
    "totalVehicle": 8
}

【问题讨论】:

  • 你能在 mongo 中展示你的收藏吗?
  • 那个样本结果就是集合先生

标签: node.js mongodb


【解决方案1】:

如果您使用版本3.4 and >,这将是适合您的查询:

YourModel.aggregate([
  {
    "$group": {
      _id: {
        "Make": "$Make",
        "Model": "$Model",
        "Year": "$Year"
      },
      "doc": {
        "$first": "$$ROOT"
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$doc"
    }
  },
  {
    "$project": {
      "Year": 1,
      "Make": 1,
      "Model": 1
    }
  }
]).exec((err, car) => /* do whatever you need */ )

如果只需要返回Ford

var filterQuery = {Make: "Ford"} // or {Year: {$in: ["2017", "2018"]}} or any other query


 YourModel.aggregate([
      {
        $match: filterQuery
      },
      {
        "$group": {
          _id: {
            "Make": "$Make",
            "Model": "$Model",
            "Year": "$Year"
          },
          "doc": {
            "$first": "$$ROOT"
          }
        }
      },
      {
        "$replaceRoot": {
          "newRoot": "$doc"
        }
      },
      {
        "$project": {
          "Year": 1,
          "Make": 1,
          "Model": 1
        }
      }
    ]).exec((err, car) => /* do whatever you need */ )

【讨论】:

  • 但是我应该把我的查询放在哪里? Vehicle.model.find(query, , "query"
  • 如果要匹配则在$group之前添加{$match: {field: condition}}
  • 因为我需要那个查询来过滤
  • 如果您添加{$match: {Make: "Ford"},您将只获得福特汽车。有意义吗?
  • 我提出该查询的原因是这些参数来自前端,它们发送例如参数年({ Year: { '$in': '2005' } }) 然后它将过滤所有年份在 2005 年的数据列表,但任何品牌都不应返回两次
【解决方案2】:

您必须在此处使用aggregate 以获取带有'Make' 的所有唯一记录

例如:

 Vehicle.model.aggregate([
    { "$match": query }, // your query here
    { "$group": { _id: "$Make", "doc":{"$first":"$$ROOT"}} }, // grouping with 'Make'
    { "$replaceRoot":{"newRoot":"$doc"} },
    { '$project': {'Year': 1, 'Make': 1, 'Model': 1} }  // filter fields
 ]).exec((err, data) => {
    if (err) // handle error;
    console.log(data);
})

【讨论】:

  • 不起作用,这是我尝试过的 Vehicle.model.find(query, { 'Year': 1, 'Make': 1, 'Model': 1 }).distinct(' Make').exec(function (err, vehicle) {
  • 不要使用 find 。仅使用不同的。 Vehicle.model.distinct('Make', query, { 'Year': 1, 'Make': 1, 'Model': 1 }).exec(function (err, vehicle) {
  • 它有效,但它只返回 Make 。如果我想包括年份和型号怎么办?
  • 你还在吗?
  • 结果未定义先生
猜你喜欢
  • 2016-07-12
  • 2016-05-08
  • 1970-01-01
  • 2019-07-23
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
相关资源
最近更新 更多