MongoDB / Mongoose使用$ unwind进行高级搜索,$ sort& $组..?

时间:2017-02-15 12:18:42

标签: javascript mongodb sorting mongoose

我的文件是产品组,如下所示:

[
  {
    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一起使用,然后尝试将该组重新组合在一起({{1}之后已经打破了$unwind数组。

products

显然Products.aggregate([ { $unwind: '$products' }, { $sort: { 'products.sku': -1 } }, { $group: { '_id': '$_id', something: { $push: '$$ROOT' } } } ]).exec() 不正确。我使用$group将原始的MongoDB '_id': '$_id'放回去了,但我不知道怎么说:

"按产品组ID分组,并包含所有原始字段"

所以,我真的尝试_id$unwind产品数组,然后我想$sort ......: - )

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

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

1 个答案:

答案 0 :(得分:1)

也许我错了,但据我所知,在分组时无法保留所有字段,您必须手动定义所有属性。这是您正在寻找的代码,它按“products.sku”键对产品组进行排序,按“sku”键对内部“products”数组进行排序,并在$ 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();