MongoTemplate Query array che soddisfano almeno i valori che sto passando

0

Domanda

Se ho un documento definito come

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

Mi piacerebbe essere in grado di eseguire query con MongoTemplate per passare un elenco di valori ["cool","incredibile"] per avere in cambio la prima collezione di sopra, non la seconda. Per ciò che intendo raggiungere, il $in condizione non sembra abbastanza. Ho provato con $tutte le condizioni e dal Mongo console funziona come ho bisogno, ma nel mio codice che qualcosa non funziona e si prende sempre per la mia query di elaborare. Con il $in operatore il mio codice va veloce, invece. Il mio metodo nel mio repository (anche per altri motivi, devo fare un'aggregazione come di seguito):

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());
    } 

Guardando questa risposta, ho provato con

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

Ma non è cambiato nulla, la query prende sempre e non con i risultati attesi. Tutte le idee per favore? Grazie!

1

Migliore risposta

0

Per trovare se tags campo di matrice contiene tutti i membri di leggere l'array, è possibile utilizzare la cuffia, se avete bisogno di essere in aggregazione pipeline di utilizzare il secondo.

Nella query si hanno più fasi, e più il codice, se si vuole chiedere di più, se si può dare i dati di esempio e di uscita prevista in JSON, e che cosa si vuole fare, in modo che le persone possono aiutare.

Query1

  • trovare utilizzando $all operatore

Codice di Test qui

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

Query2

  • soluzione di aggregazione con la differenza set

Codice di Test qui

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

Ciao Takis, grazie per i vostri consigli! Ciò di cui ho bisogno è di farlo con Java, non via Mongo console dove già funziona. Con MongoTemplate avrei dovuto usare una Proiezione, e nel mio caso preferisco attaccare con l'Aggregazione. Per gli esempi di codice, ho solo bisogno di unire due collezioni (Aggregazione) e di una query in un Array presente nel "MyBook" collezione che mi unisco alla
Barbi

In altre lingue

Questa pagina è in altre lingue

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