2017-02-15 59 views
2

我有一个是产品组文件,就像这样:

[ 
    { 
    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该产品阵列,然后我想要$wind_it_back_up_again ... :-)

我该如何实现这个..?

更新:这个问题是关于保持所有领域,而分组。

+0

的可能的复制[MongoDB的排序内部阵列(http://stackoverflow.com/questions/15388127/mongodb-sort-inner-array) – Veeram

+1

@Veeram我认为这是问题,不仅有关排序的内部阵列,但也关于保持所有领域,所以它是不同的 –

+1

好吧。为了保持领域,你可以尝试这样的事情。 '{$ group:{_id:'$ _id',options:{'$ first:'$ options'},'products':{$ push:'$ products'}}}'保持原样。 – Veeram

回答

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(); 
+0

谢谢,这确实有效。这意味着如果我改变'Products'模式以在根级别包括更多的字段(沿着'options'和'products'),我将不得不记住要更新这个'aggregate()',这是一个疼痛。 –

+0

是的,你必须在分组阶段明确定义所有字段。我也对这个问题感兴趣,所以我会继续研究 –