簡體   English   中英

Spring 數據 MongoDB 聚合返回空數據,但適用於具有相同管道的 Compass

[英]Spring Data MongoDB Aggregation return empty data but works on Compass with the same pipeline

我在查詢 mongoDB 數據時遇到問題。 這是文件:

{
   productId:1,
   warehouses:[
             warehouseId:1,
             productBatch:[
                          {
                            unitPrice:15.5,
                            quantity:1000,
                            expireSearchTimestamp:14145555545,
                            currentQuantity:50
                          },{
                            unitPrice:17.5,
                            quantity:1000,
                            expireSearchTimestamp:14145555545,
                            currentQuantity:50
                          }
               ]
          ]
}

並且通過代碼是

public List<ProductSearchResult> findCustomSearch(List<Integer> medicines,
            List<Integer> warehousesIds, int quantity)
    {
        UnwindOperation unwind1 = Aggregation.unwind("warehouses");
        UnwindOperation unwind2 = Aggregation.unwind("warehouses.productBatch");
        ProjectionOperation project = Aggregation.project("warehouses.productBatch");
        MatchOperation match = Aggregation.match(Criteria.where("productId").in(productIds)
                .and("warehouses.warehouseId").in(warehousesIds)
                .and("warehouses.productBatch.currentQuantity").gte(quantity));
        SortOperation sort = Aggregation.sort(Direction.ASC, "productBatch.unitPrice");
        LimitOperation limit = Aggregation.limit(3);
        Aggregation aggregation = Aggregation
                .newAggregation(unwind1, unwind2, project, sort, limit)
                .withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).explain(true)
                        .cursor(new BasicDBObject()).build());
            AggregationResults<ProductSearchResult> results = mongoTemplate.aggregate(aggregation,
                    "medicine", ProductSearchResult.class);
            List<ProductSearchResult> mappedResults = results.getMappedResults();
            return mappedResults;
        }

這是 function output

[
    {
        "$unwind": "$warehouses"
    },
    {
        "$unwind": "$warehouses.productBatch"
    },
    {
        "$match": {
            "productId": {
                "$in": [
                    20,
                    21
                ]
            },
            "warehouses.warehouse_id": {
                "$in": [
                    1,
                    2,
                    3,
                    4,
                    5
                ]
            },
            "warehouses.productBatch.currentQuantity": {
                "$gte": 10
            }
        }
    },
    {
        "$project": {
            "medicine_search": "$warehouses.productBatch"
        }
    },
    {
        "$sort": {
            "productBatch.unitPrice": 1
        }
    },
    {
        "$limit": 3
    }
]

當我運行這個 function 時,我得到了空列表,但根據 mongo compass,我得到了 3 個元素。

謝謝

我不知道為什么這段代碼不起作用,但下面的代碼讓我滿意

public void finalTry(List<Integer> productIds,
            List<Integer> warehousesIds, int q, int limitN)
    {
        DBCollection collection = mongoTemplate.getCollection("product");
        DBObject limit = new BasicDBObject("$limit", limitN);
        DBObject sort = new BasicDBObject("$sort",
                new BasicDBObject("productBatch.unitPrice", 1));
        DBObject unwind1 = new BasicDBObject("$unwind", "$warehouses");
        DBObject unwind2 = new BasicDBObject("$unwind", "$warehouses.productBatch");
        DBObject project = new BasicDBObject("$project",
                new BasicDBObject("productBatch", "$warehouses.productBatch"));
        DBObject match1 = new BasicDBObject("$match",
                new BasicDBObject("productId", new BasicDBObject("$in", productIds)));
        DBObject match2 = new BasicDBObject("$match", new BasicDBObject("warehouses.warehouseId",
                new BasicDBObject("$in", warehousesIds)));
        DBObject match3 = new BasicDBObject("$match", new BasicDBObject(
                "warehouses.productBatch.currentQuantity", new BasicDBObject("$gte", q)));

        List<DBObject> pipeline = Arrays.asList(match1, unwind1, match2, unwind2, match3, project,
                sort, limit);
        AggregationOutput output = collection.aggregate(pipeline);
        for (DBObject d : output.results())
        {
            System.out.println(d)
        }
    }

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM