Запрос нескольких коллекций с использованием шаблона Mongo

Products : {

           id : 1
}

Customer : {
     id : 2
}

List<> customerProductIds = new Arraylist();

Я хочу запросить как продукт, так и клиента и проверить, есть ли в списке идентификаторы клиентов и идентификаторы продуктов, если да, вернуть комбинированный список как объект.

Примечание: у нас нет никакой связи между двумя коллекциями.

Запрос, который я использую,

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, которую я могу реализовать для этого требования?

Надеюсь, сценарий прояснится.

1 ответ

Это виновник Product.class.getName(), Это даст полное имя класса с путем.
Вы можете использовать Product.class.getSimpleName() или просто используйте имя коллекции напрямую.
Другое дело для иностранного поля, которое вы не должны давать 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);
Другие вопросы по тегам