使用Mongo模板

时间:2018-02-14 10:25:47

标签: mongodb mongodb-query aggregation-framework spring-data-mongodb mongotemplate

Products : {

           id : 1
}

Customer : {
     id : 2
}

列表与LT;> customerProductIds = new Arraylist();

我想查询产品和客户,如果是,则返回组合列表作为对象,检查列表中是否有客户ID和产品ID。

注意 我们在两个集合之间没有任何连接。

我正在使用的查询是

LookupOperation lookupOperation = LookupOperation.newLookup().from("Product")

        .localField("_id").foreignField(" customer._id").as("entity");

    AggregationResults<Object> entities =

        this.template.aggregate(

            Aggregation.newAggregation(lookupOperation,

                Aggregation.match(Criteria.where("id").in(ids))),

            Customer.class, Object.class);

但它不起作用。我正在寻找更好的方法。有什么建议吗?

注意 可能查找作为SQL中的连接工作,其中查找外键 - 主键关系,此处不适用因为两个集合都是独立的。

最初我有两个不同的查询并将其添加到列表中。但我需要为组合列表实现分页。如果我使用两种查询方法,我将无法处理组合列表的分页。

Map reduce中是否有可以为此要求实现的选项?

希望情景清除。

1 个答案:

答案 0 :(得分:0)

这是罪魁祸首Product.class.getName()。这将给出带有路径的完整班级名称 您可以使用Product.class.getSimpleName()或直接使用集合名称 另一件事是foriegn字段你不应该给customer._id。只需指定为_id

LookupOperation lookupOperation = LookupOperation.newLookup()
.from("ProductCollectionName")
.localField("fieldNameInCustomerCollection")
.foreignField("fieldNameInProductCollection").as("entity");

AggregationResults<Object> entities =
    this.template.aggregate(
        Aggregation.newAggregation(lookupOperation,
            Aggregation.match(Criteria.where("id").in(ids))), 
            Customer.class, Object.class);