MongoTemplate Interogare matrice care se potrivesc cel puțin valorile sunt in trecere

0

Problema

Dacă am o Documente definit ca

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

Mi-aș dori să fie în măsură pentru a interoga cu MongoTemplate în scopul de a trece o listă de valori, cum ar fi ["cool","uimitor"] și au în schimb prima colectie de mai sus, nu cel de-al doilea. Pentru ce adică să se realizeze, $în stare nu pare suficient. Am încercat cu $tot condiție și din Mongo consola functioneaza cum trebuie, dar în codul meu ceva nu este de lucru și este nevoie de totdeauna pentru interogare de a elabora. Cu $în operator codul meu merge repede, în loc. Metoda mea în depozit (pentru alte motive, trebuie să fac o agregare de mai jos):

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

Privind la acest răspuns, am incercat cu

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

Dar nimic nu s-a schimbat, interogarea durează pentru totdeauna și nu cu rezultatul așteptat. Orice idei va rog? Vă mulțumesc!

1

Cel mai bun răspuns

0

Pentru a afla dacă tag-uri matrice câmp conține toți membrii youe matrice, poate utiliza de mai jos, dacă aveți nevoie de ea pentru a fi în agregare conducte folosi cel de-al doilea.

În interogare aveți mai multe etape, și mai mult cod, dacă doriți pentru a cere mai mult, dacă puteți da exemplu de date și temperatura de ieșire în JSON, și ceea ce vrei să faci, astfel încât oamenii se pot ajuta.

Interogare1

  • găsi folosind $all operator

Cod de încercare aici

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

Query2

  • agregarea soluție cu set diferența

Cod de încercare aici

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

Salut Takis, multumesc pentru sfaturi! Ceea ce am nevoie este de a face cu Java, nu prin Mongo consola unde deja funcționează. Cu MongoTemplate ar trebui să utilizați o Proiecție, și în cazul meu, prefer să rămân cu Agregare. Pentru exemple de cod, trebuie doar să se alăture două colecții (de Agregare) și interogare pe o Matrice prezent în "MyBook", o colecție care I se alăture în
Barbi

În alte limbi

Această pagină este în alte limbi

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