本文介绍了MongoDB聚合中映射结果与原始结果不同的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我正确的mongo查询的外观-

db.getCollection('product').aggregate([
{ "$match": { "itemSku": "TOS-16000-00623-00013" } },

{ "$unwind": "$priceInfoList" },

{ "$match": { "priceInfoList.communityId": 3  }},

 { "$group": {
        "_id": "$_id",
        "priceInfoList": { "$push": "$priceInfoList" }
    }}

])

这是实际产出和预期产出-

/* 1 */
{
    "_id" : ObjectId("61d815d0538792764c2df576"),
    "priceInfoList" : [ 
        {
            "listPrice" : 0.0,
            "offerPrice" : 0.0,
            "zoneId" : NumberLong(738),
            "communityId" : NumberLong(3),
            "storeType" : "Retailer",
            "principalGroup" : "DRP",
            "isActive" : true
        }, 
        {
            "listPrice" : 0.0,
            "offerPrice" : 0.0,
            "zoneId" : NumberLong(606),
            "communityId" : NumberLong(3),
            "storeType" : "Wholeseller",
            "principalGroup" : "DRP",
            "isActive" : true
        }, 
        {
            "listPrice" : 0.0,
            "offerPrice" : 0.0,
            "zoneId" : NumberLong(606),
            "communityId" : NumberLong(3),
            "storeType" : "Retailer",
            "principalGroup" : "NonDRP",
            "isActive" : true
        }
    ]
}

现在我正尝试使用Mongo模板在Spring Boot中实现同样的事情,但我从映射结果中得到的输出与原始结果不同。请查看截图。

您可以看到,在映射结果中,我只得到一个priceInfo,而且也有空值,但我的原始结果是正确的。我知道映射结果返回的是PriceInfo而不是List。以下是我在春季使用mongo模板编写的代码

public List<PriceInfo> findByCommunityOrPrincipalGroupOrStoreOrZone(String SKU, Long communityId, String principalGroup, String storeType, Long zoneId) {
    Criteria criteria = generateCriteriaToFilterSegments(communityId,principalGroup,storeType,zoneId);
    MatchOperation matchOperation = Aggregation.match(criteria);

    MatchOperation matchOperationSKU = Aggregation.match(Criteria.where("itemSku").is(SKU));

    UnwindOperation unwind = Aggregation.unwind("priceInfoList");

    GroupOperation groupOperation = Aggregation.group().push("priceInfoList").as("priceInfoList");

    Aggregation aggregation = Aggregation.newAggregation(matchOperationSKU,unwind,matchOperation,groupOperation);

    AggregationResults<PriceInfo> priceInfosAggregationResults
            = mongoTemplate.aggregate(aggregation, "product", PriceInfo.class);
    return priceInfosAggregationResults.getMappedResults();
  }

  private Criteria generateCriteriaToFilterSegments(Long communityId, String principalGroup, String storeType, Long zoneId) {
    Criteria criteria = new Criteria();
    if(communityId != null) {
      criteria.and("priceInfoList.communityId").is(communityId);
    }
    if(principalGroup != null) {
      criteria.and("principalGroup").is(principalGroup);
    }
    if(storeType != null) {
      criteria.and("storeType").is(storeType);
    }
    if(zoneId != null) {
      criteria.and("zoneId").is(zoneId);
    }
    return criteria;
  }

我如何更正它?

编辑-1

推荐答案

不是真正的答案,而是

db.getCollection('product').aggregate([
   { "$match": { "itemSku": "TOS-16000-00623-00013" } },
   { "$unwind": "$priceInfoList" },
   { "$match": { "priceInfoList.communityId": 3 } },
   {
      "$group": {
         "_id": "$_id",
         "priceInfoList": { "$push": "$priceInfoList" }
      }
   }
])

我会试试这个:

db.getCollection('product').aggregate([
   { $match: { itemSku: "TOS-16000-00623-00013" } },
   {
      $project: {
         priceInfoList: {
            $filter: {
               input: "$priceInfoList",
               cond: { $eq: ["$$this.communityId", 3] }
            }
         }
      }
   }
])

结果应该是相同的,并且可能更容易将其映射到Spring。我对春季数据不是不熟悉。

这篇关于MongoDB聚合中映射结果与原始结果不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-03 04:14