Tablica zapytań MongoTemplate, odpowiadającą co najmniej wartości, które wysyłam

0

Pytanie

Jeśli mam dokumenty, określone jako

[
  {
    "title": "title",
    "tags": [ "cool", "amazing", "funny" ]
  },
  {
    "title": "another title",
    "tags": [ "nice", "amazing", "funny" ]
  }
]

Chciałbym mieć możliwość zażądania za pomocą MongoTemplate, aby wysłać listę wartości, takich jak ["super","świetnie"], i w zamian uzyskać pierwszą kolekcję wyżej, a nie drugą. Do tego, co chcę osiągnąć, $w stanie wydają się niewystarczające. Próbowałem wykonać warunek $all, i z konsoli Mongo działa tak, jak trzeba, ale w moim kodzie jest coś nie działa, i dla rozwoju mojego wniosku wymagane jest wieczność. Zamiast tego z operatorem $in mój kod działa szybko. Moja metoda w moim repozytorium (z innych powodów muszę wykonać agregację, jak pokazano poniżej):

public Page<MyDocument> findByProperties(String title, List<ObjectId> tags, Pageable page) {
        final List<Criteria> criteria = new ArrayList<>();
        Aggregation aggregation = null;

        
        if (title != null && !title.isEmpty()) {
            criteria.add(Criteria.where("title").is(title));
        }
        
        if (tags != null && !tags.isEmpty()) {
            criteria.add(Criteria.where("MyBook.tags").all(tags));
        }

        if (!criteria.isEmpty()) {
            aggregation = Aggregation.newAggregation(
                    Aggregation.lookup("from_collection", "_id", "idParent", "MyBook"),
                    Aggregation.unwind("MyBook"),
                    Aggregation.match(new Criteria().andOperator(criteria.toArray(new Criteria[0]))),
                    Aggregation.skip(page.getOffset()),
                    Aggregation.limit(page.getPageSize()),
                    Aggregation.sort(page.getSort())
            );
        } else {
            aggregation = Aggregation.newAggregation(
                    Aggregation.lookup("from_collection", "_id", "idParent", "MyBook"),
                    Aggregation.unwind("MyBook"),
                    Aggregation.skip(page.getOffset()),
                    Aggregation.limit(page.getPageSize()),
                    Aggregation.sort(page.getSort())
            );
        }

        List<MyDocument>  results  = mongoTemplate.aggregate(aggregation, "my_document", MyDocument.class).getMappedResults();

        return PageableExecutionUtils.getPage(results, page,
                () -> (long)results.size());
    } 

Patrząc na to odpowiedź, próbowałem z

criteria.add(Criteria.where("MyBook.tags").in(tags).all(tags));

Ale nic się nie zmieniło, żądanie trwa wiecznie i nie z oczekiwanym rezultatem. Jakieś pomysły, proszę? Dziękuję!

1

Najlepsza odpowiedź

0

Aby dowiedzieć się, czy zawiera pole tablicy tagów wszystkie elementy macierzy, można użyć następujący, jeśli chcesz, aby było ono w procesie agregacji, użyj drugie.

W swoim zapytaniu masz więcej etapów i więcej kodu, jeśli chcesz zadać więcej pytań, czy możesz podać przykłady danych i oczekiwanych danych wyjściowych w formacie JSON, i co chcesz zrobić, aby ludzie mogli pomóc.

Wniosek 1

  • znaleźć za pomocą $all operator

Testowy kod tutaj

db.collection.find({"tags": {"$all": ["cool","amazing"]}})

Zapytanie 2

  • rozwiązanie do agregowania z zadaną różnicy

Testowy kod tutaj

aggregate(
[{"$match": 
    {"$expr": 
      {"$eq": [{"$setDifference": [["cool", "amazing"], "$tags"]}, []]}}}])
2021-11-23 17:19:23

Witam, Takis, dziękuję ci za twoje rady! Co muszę zrobić to za pomocą Java, a nie przez konsolę Mongo, gdzie ona już działa. Z MongoTemplate musiałbym użyć Projekcji, i w moim przypadku wolałbym trzymać Agregacji. Do przykładów kodu, po prostu muszę połączyć dwie kolekcje (agregacja) i poprosić o tablicę, obecny w kolekcji "Moja książka", w którą dołączam
Barbi

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................