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

Products : {

           id : 1
}

Customer : {
     id : 2
}

Список‹> customerProductIds = новый 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 Reduce, которые я могу реализовать для этого требования?

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


person Raj gopal    schedule 14.02.2018    source источник
comment
Почему бы не сделать два запроса для каждой коллекции и не вернуть результаты?   -  person s7vr    schedule 14.02.2018
comment
Изначально я так и сделал. Два разных запроса и добавление их в список. Но мне нужно реализовать разбиение на страницы для объединенного списка. Если бы я использовал подход с двумя запросами, было бы сложно справиться с нумерацией страниц.   -  person Raj gopal    schedule 14.02.2018


Ответы (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);
person pvpkiran    schedule 14.02.2018
comment
Но будет ли это соответствовать требованию, потому что, когда я говорю localField(_id).foreignField(customer._id) , он не проверяет, совпадают ли локальный _id и Foreign_id. (как в sql присоединяется). ? Здесь обе коллекции не имеют никакой связи, это всего две коллекции. - person Raj gopal; 14.02.2018
comment
да, но вы неправильно назвали коллекцию. Немного отредактировал свой ответ - person pvpkiran; 14.02.2018
comment
вы указали неправильное имя коллекции (например, Product.class.getName().). - person pvpkiran; 15.02.2018
comment
Я изменил его. Дело в том, что даже если я использую этот запрос, это не дает должного результата. Потому что customer.id никогда не может быть равен product.id, обе коллекции не имеют никакой ссылки, они независимы. когда я использую поиск, он на самом деле пытается присоединиться, используя оба идентификатора. - person Raj gopal; 15.02.2018
comment
если ссылки нет то как это будет работать? В этом весь смысл LookUp - person pvpkiran; 15.02.2018
comment
Ага. То, что я указал в посте, не работает. Ищу любые другие предложения, кроме поиска, с помощью которых я могу выполнить свой запрос - person Raj gopal; 15.02.2018
comment
такого нет. вы должны запрашивать отдельно в каждой коллекции - person pvpkiran; 15.02.2018