node.js - Mongodb聚合传递匹配的数组和不匹配的数组

标签 node.js mongodb match aggregate

我有一个 MongoDB/Nodes 聚合,看起来有点像这样(其中还有其他值,但这是基本思想)。

            [
            {
            '$unwind': {
                'path': '$Vehicles'
                }
            },
            {
            '$match': {
                'Vehicles.Manufacturer': 'FORD'
                }
            },
            {
            '$facet': {
                'makes': [
                        {
                    '$group': {
                    '_id': '$Vehicles.Manufacturer', 
                    'count': {
                        '$sum': 1
                                }
                            }
                        }
                    ]
                }
            },
            {
            '$project': {
                'makes': {
                '$sortArray': {
                    'input': '$makes', 
                    'sortBy': 1
                        }
                    }
                }
            }
        ]

这很好用。但我还想传递一份无与伦比的 list 。 IE 是一组制造商 = FORD 的车辆以及所有制造商的其他列表。

无法让它工作。请问有什么想法吗?

提前致谢。

编辑:-

当前输出如下所示:

      [{
    "makes": [
      {
        "_id": "FORD",
        "count": 285
      }
    ]
  }]

理想情况下它看起来像这样:

      [{
    "makes": [
      {
        "_id": "FORD",
        "count": 285
      }
    ],
    "unfiltered_makes": [
      {
        "_id": "ABARTH",
        "count": 1
      },
      {
        "_id": "AUDI",
        "count": 7
      },
      {
        "_id": "BMW",
        "count": 2
      },
      {
        "_id": "CITROEN",
        "count": 4
      },
      {
        "_id": "DS",
        "count": 1
      },
      {
        "_id": "FIAT",
        "count": 1
      }.... etc
    ]
  }]

数据看起来有点像这样:

"Vehicles": [
{
  "Id": 1404908,
  "Manufacturer": "MG",
  "Model": "3",
  "Price": 11995 .... etc
},{
  "Id": 1404909,
  "Manufacturer": "FORD",
  "ManufacturerId": 34,
  "Model": "Focus",
  "Price": 12000 .... etc
} ... etc
]

最佳答案

在这种情况下,您可以执行以下操作:

db.collection.aggregate([
  {$unwind: "$Vehicles"},
  {$group: {
      _id: "$Vehicles.Manufacturer",
      count: {$sum: 1}}
  },
  {$facet: {
      makes: [{$match: {_id: "FORD"}}],
      unfiltered_makes: [{$group: {_id: 0, data: {$push: "$$ROOT"}}}]
    }
  },
  {$project: {makes: 1, unfiltered_makes: "$unfiltered_makes.data"}}
])

看看它在 playground example 上的工作原理

另一个选项是:

db.collection.aggregate([
  {$unwind: "$Vehicles"},
  {$group: {
      _id: "$Vehicles.Manufacturer",
      count: {$sum: 1}}
  },
  {$group: {
      _id: 0,
      unfiltered_makes: {$push: "$$ROOT"},
      makes: {$push: {$cond: [{$eq: ["$_id", "FORD"]}, "$$ROOT", "$$REMOVE"]}}
    }
  }
])

看看它在 playground example 上的工作原理

关于node.js - Mongodb聚合传递匹配的数组和不匹配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73208415/

相关文章:

javascript - Mongo db.getCollection 不是函数

mongodb - 在 mongodb 集群上创建第一个管理员用户时出现错误 "couldn' t 添加用户 : not authorized on admin to execute command"

javascript 正则表达式匹配未按预期工作

node.js - nodejs中的子域

mysql - Node.js 作为带有 MySQL 的网络服务器

javascript - 使用 JavaScript SDK 的预签名 URL 的 AWS Transfer Acceleration

c# - 在 SQL Server 上存储 NoSQL 数据?

javascript - 如何在键值对的特定位置写入js文件?

python - 如何针对单个值测试多个变量是否相等?

PHP Mysql更新集替换完全匹配