Wątek przeniesiony 2022-02-20 20:04 z Bazy danych przez Patryk27.

Jak zwrócić zasoby tylko o podanych ID?

0

Hej,

Korzystam z Mongodb i Kmongo. Potrzebuję dostać listę zasobu podając w zapytaniu liste idków. Problem wydaje się prosty ale wertując dokumentacje nie mam pomysłu jak dobrze zbudować takie zapytanie.

Wysyłam request zawierający listę idków zasobu -> pobieram z mongo tylko te itemy, których id są na liście -> Zwracam liste.

Próbowałem różnych podejść, przykładowo jakbym widział użycie Aggregate, które niestety nie działa:

override suspend fun getProductsById(input: List<String>): List<Product> {
    return productsCollection.aggregate<Product>(
        match(Product::_id in input)
    ).toList()
}

Mam z tyłu głowy, że można by po prostu przelecieć w pętli po liście idków używając:

productsCollection.findOne(Product::_id eq itemId)

Ale to jest chyba najdurniejsze rozwiązanie, szczególnie jak zechcemy pobrać więcej niż kilka itemów.

0

Po pierwsze primo, nie znam się na kotlinie/ktorze, to się wypowiem ;-) Może zamiast findOne użyj find, o ile frejmwork wspiera productsCollection.find(Product::_id in input).

Po drugie primo, input : List<String> - znowu nie znam się na kotlinie/ktorze, ale _id wygląda na ObjectId, a Ty przekazujesz String.
Coś robi automagiczną konwersję (String -> ObjectId) czy może potrzebujesz "ręcznie" przekonwertować List<String> na List<ObjectId> ?

I po trzecie, może bardziej pasowałoby wrzucić to do działu Java/Inne języki?

0

@yarel:

yarel napisał(a):

Po pierwsze primo, nie znam się na kotlinie/ktorze, to się wypowiem ;-) Może zamiast findOne użyj find, o ile frejmwork wspiera productsCollection.find(Product::_id in input).

Zgadzam się i wygląda jakby wspierał ale tu nie potrafię poradzić sobie z błędem

Type inference failed. The value of the type parameter T should be mentioned in input types (argument types, receiver type or expected type). Try to specify it explicitly.

Po drugie primo, input : List<String> - znowu nie znam się na kotlinie/ktorze, ale _id wygląda na ObjectId, a Ty przekazujesz String.
Coś robi automagiczną konwersję (String -> ObjectId) czy może potrzebujesz "ręcznie" przekonwertować List<String> na List<ObjectId> ?

Zgadza się, na razie sobie grzebie ale docelowo _id stringiem nie będzie.

I po trzecie, może bardziej pasowałoby wrzucić to do działu Java/Inne języki?

Tak mi pasowało by to wrzucić tutaj jak patrzyłem jakie pytania o mongo padają ale jak Mod tak uważa to może być i w Javie, szczególnie, że to nie z kmongo może być nie jasnoć ale czymś specyficznym dla samego jezyka czego nie ogarniam, vide błąd powyżej.

1

@Kerubyte: Type inference failed. wygląda, że nie potrafi wykumać typu. Spróbowałbym productsCollection.find<Product>(Product::_id in input)
Wydaje mi się, że jednak sensowniejsze odpowiedzi dostaniesz w dziale keczupowym.

1

Ok, dotykam kilku wątków w pytaniu więc faktycznie może nie do końca jest jasne o co chodzi konkretnie :D

Problem dotyczy pobrania z bazy tylko okreslonych itemów, tych, których id jest na liście.
Tak czy inaczej, udało mi się to ogranąć, dzięki https://docs.mongodb.com/manual/reference/operator/query/in/.

Mój problem leżał w tym, że używałem Kotlinowego in, które jak słusznie zauważył @Charles_Ray traktowałem jako boolean expr zamiast odpowiedniego dla Mongo Bson Filter operatora o podobnej nazwie in :)

Wystarczy:

override suspend fun getProductsById(input: List<String>): List<Product> {

    return productsCollection.find(Product::_id `in` input).toList()
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1