Запрос нескольких коллекций с использованием шаблона 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);