MongoDB在$ match,$ group,$ lookup查询中的$ unwind位置

时间:2019-02-22 11:05:08

标签: node.js mongodb

我对mongo查询中$unwind的位置有疑问。我在他们的文档中找不到任何相关内容,所以我在这里问:)也许有人可以向我解释一下。

我具有以下查询结构

collection.aggregate([ 
{ '$lookup': { from: 'bill_position', localField: 'billPositions', foreignField: '_id', as: 'joined_bill_pos' } }, 
{ '$unwind': '$joined_bill_pos' },
{ '$match': { '$and': [ 
{
    $or: [
      { 'joined_bill_pos.pricelistItem.itemType': { '$in': [ // some data ..  ] } }, 
      {'joined_bill_pos.isPackage': {$eq: true}},
    ]
},
{ date: { '$gte': 1485903600000 } }, { date: { '$lte': 1582930799000 } }, 
{ closed: true }, 
{ '$group': { _id: { 
    name: '$joined_bill_pos.pricelistItem.itemType', 
    isPackage: '$joined_bill_pos.isPackage' }, 
    count: { '$sum': '$joined_bill_pos.quantity' }, 
    total: { '$sum': { '$subtract': [ '$joined_bill_pos.totalPrice', '$joined_bill_pos.discount' ] } } } } ]
)

在我犯错并放置

之前,现在看来工作正常
{ '$unwind': '$joined_bill_pos' },

之后
 { '$match': { '$and': [ ....

我的问题是,如果$unwind在比赛结束后仍然可以正常工作?为什么结果不同?作为附加信息,billPositions(在查找中)是一个ID数组。

1 个答案:

答案 0 :(得分:0)

我也想知道展开的作用是什么,最后根据我的理解,它将把查找的数组结果解构为对象结果列表。

执行并检查两个查询的结果。您将对此有所了解。

collection.aggregate([ 
{ '$lookup': { from: 'bill_position', localField: 'billPositions', foreignField: '_id', as: 'joined_bill_pos' } }
])

collection.aggregate([ 
{ '$lookup': { from: 'bill_position', localField: 'billPositions', foreignField: '_id', as: 'joined_bill_pos' } }, 
{ '$unwind': '$joined_bill_pos' }
])