【问题标题】:MongoDB/Mongoose advanced search with $unwind, $sort & $group..?使用 $unwind、$sort 和 $group.. 的 MongoDB/Mongoose 高级搜索?
【发布时间】:2017-07-04 02:30:15
【问题描述】:

我有属于产品组的文档,如下所示:

[
  {
    options: [],
    products: [
      {
        sku: '123',
        name: 'Product name 1'
      }, {
        sku: '476',
        name: 'Product name 2'
      }
    ]
  }, {
    options: [],
    products: [
      {
        sku: '265',
        name: 'Product name 3'
      }, {
        sku: '789',
        name: 'Product name 4'
      }
    ]
  }
]

我需要做的是一个高级查询,其中不仅包括对产品组的排序,还包括对其中的产品数组进行排序。

我目前尝试的方法是将aggregate()$unwind$sort 一起使用,然后尝试将组重新组合在一起(在$unwind 破坏了products 数组之后)。

Products.aggregate([
  { $unwind: '$products' },
  { $sort: {
    'products.sku': -1
  } },
  { $group: {
    '_id': '$_id',
    something: { $push: '$$ROOT' }
  } }
]).exec()

显然是$group 不对。我用'_id': '$_id'把原来的MongoDB_id放回去了,但是不知道怎么说:

“按产品组id分组,包含所有原始字段”

所以我真的在尝试 $unwind$sort products 数组,然后我想 $wind_it_back_up_again... :-)

我怎样才能做到这一点..?

更新:这个问题是关于在分组时保留所有字段。

【问题讨论】:

  • Mongodb sort inner array的可能重复
  • @Veeram 我认为这不仅是关于对内部数组进行排序的问题,而且是关于在分组时保留所有字段的问题,所以它是不同的
  • 好的。要保留这些字段,您可以尝试这样的事情。 {$group: {_id: '$_id', options:{'$first:'$options'},'products': {$push: '$products'}}} 并保持相同的休息。
  • 同意你的观点:)

标签: javascript mongodb sorting mongoose


【解决方案1】:

也许我错了,但我知道在分组时没有保留所有字段的选项,您必须手动定义所有属性。这是您要查找的代码,它按“products.sku”键对产品组进行排序,按“sku”键对内部“产品”数组进行排序,并在 $group 和 $project 阶段保留所有字段。

db.test.aggregate([
    {$unwind: "$products"},
    {$sort: {"products.sku": -1}},
    {$group: {
        _id: {_id: "$_id", options: "$options"}, products: {$push: "$products"}
    }},
    {$project: {
        _id: "$_id._id",
        options: "$_id.options",
        products: "$products"
    }},
    {$sort: {"products.sku": -1}}
]).pretty();

【讨论】:

  • 谢谢,这确实有效。这确实意味着,如果我更改Products 架构以在根级别包含更多字段(以及optionsproducts),我将不得不记住还要更新此aggregate(),这很痛苦。
  • 是的,您必须在分组阶段明确定义所有字段。我也对这个问题感兴趣,所以我会继续研究
  • 您说您的目标是“不仅对产品组进行排序,而且对.b 内的产品数组进行排序”您是否根据具有最高 sku 的产品对产品组进行排序?因为我正在尝试同样的事情,所以我遇到了完全相同的问题,但是在聚合的最后一行,使用 '{$sort: {"products.sku": -1}}' 并使用 '{$sort: { "products[0].sku": -1}}' 给了我不同的结果,我不明白为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2017-07-01
  • 2017-01-02
  • 2019-09-03
  • 2012-05-07
  • 2017-05-14
  • 2019-01-21
相关资源
最近更新 更多