Mongodb组并使用空数组进行推送

时间:2019-05-26 10:18:48

标签: mongodb mongodb-query aggregation-framework

当存在可能为<div class="col-md-4" *ngFor="let city of cities; let i = index"> <span>{{city.cityWeather.list[0].main.temp | kelvinToCelcius}} &#8451;</span> <span>{{city.cityWeather.list[0].wind.speed | mtrPersecToKmPerhr}} km/h</span> </div> 的数组时,我遇到group的问题。 该集合可能是这样的:

empty

如您所见,有时{ "_id" : "Contract_1", "ContactId" : "Contact_1", "Specifications" : [ ] } { "_id" : "Contract_2", "ContactId" : "Contact_2", "Specifications" : [ { "Description" : "Descrizione1", "VehicleId" : "Vehicle_1", "Customizations" : [ { "Description" : "Random furniture", "ContactId" : "Contact_5" }, { "Description" : "Random furniture 2", "ContactId" : "Contact_3" } ] }, { "Description" : "Descrizione2", "VehicleId" : "Vehicle_2", "Customizations" : [ { "Description" : "Random furniture", "ContactId" : "Contact_5" }, { "Description" : "Random furniture 2", "ContactId" : "Contact_3" } ] } ] } { "_id" : "Contract_3", "ContactId" : "Contact_25", "Specifications" : [ { "Description" : "Descrizione1", "VehicleId" : "Vehicle_1", "Customizations" : [] }, { "Description" : "Descrizione2", "VehicleId" : "Vehicle_2", "Customizations" : [] } ] } 可以为null,也可以为Specifications。 这是我执行的查询:

Customizations

查询执行后,当它执行2 db.getCollection("Contract").aggregate([ { "$lookup": { "from": "Contact", "localField": "ContactId", "foreignField": "_id", "as": "Contact" }}, { "$unwind": {"path":"$Contact", "preserveNullAndEmptyArrays":true }}, { "$unwind": { "path": "$Specifications", "preserveNullAndEmptyArrays":true }}, { "$lookup": { "from": "Vehicle", "localField": "Specifications.VehicleId", "foreignField": "_id", "as": "Specifications.Vehicle" }}, { "$unwind": {"path": {"$Specifications.Vehicle","preserveNullAndEmptyArrays":true} }, { "$unwind": {"path": {"$Specifications.Customizations","preserveNullAndEmptyArrays":true} }, { "$lookup": { "from": "Contact", "localField": "Specifications.Customizations.ContactId", "foreignField": "_id", "as": "Specifications.Customizations.Contact" }}, { "$unwind": {"path": {"$Specifications.Customizations.Contact","preserveNullAndEmptyArrays":true} }, { "$group": { "_id": { "_id": "$_id", "Description": "$Specifications.Description" }, "ContactId": { "$first": "$ContactId" }, "Contact": { "$first": "$Contact" }, "Specifications": { "$push": "$Specifications.Customizations" } }}, { "$group": { "_id": "$_id._id", "ContactId": { "$first": "$ContactId" }, "Contact": { "$first": "$Contact" }, "Specifications": { "$push": { "Description": "$_id.Description", "Customizations": "$Specifications" } } }} ]) }}, { "$group": { "_id": "$_id._id", "ContactId": { "$first": "$ContactId" }, "Contact": { "$first": "$Contact" }, "Specifications": { "$push": { "Description": "$_id.Description", "Customizations": "$Specifications" } } }} ]) 时会产生问题,因为对于第一个查询,当$group pushing会创建一个内部带有空元素的数组。我想要的是,如果$Specifications.Customizations是一个空数组,它将保持原样,而无需在其中添加空元素。

2 个答案:

答案 0 :(得分:1)

这是嵌套数组的$unwind$group的缺点之一。要摆脱这种情况,您需要再添加一个阶段$addFields来过滤出空的嵌套数组。

将其添加到管道的结尾

{ "$addFields": {
  "Specifications": {
    "$filter": {
      "input": "$Specifications",
      "cond": { "$ne": ["$$this.Description", undefined] }
    }
  }
}}

答案 1 :(得分:0)

对于像我一样仍然有同样问题的人,@Ashh 的答案对他们不起作用(我不知道为什么它对我不起作用)。 $ifNull 而不是 $ne 对我有用,就像这样:

{ "$addFields": {
  "Specifications": {
    "$filter": {
      "input": "$Specifications",
      "cond": { "$ifNull": ["$$this.Description", false] }
    }
  }
}}