MongoTemplate Dotaz pole, ktoré zodpovedajú aspoň hodnoty som absolvovanie

0

Otázka

Ak mám podklady definované ako

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

Ja by som chcel byť schopný dotaz s MongoTemplate, aby sa prejsť zoznam hodnôt, ako ["cool","úžasné"] a mať vrátiť prvá kolekcia hore, a nie druhý. Za to, čo mám na mysli na dosiahnutie $v stave, nemá sa zdá, že dosť. Snažil som sa s $všetky podmienky a z Mongo konzoly to funguje ako potrebujem, ale v mojom kód nie je niečo v poriadku a to trvá celú večnosť na môj dotaz rozvinúť. S $v operátora môj kód ide rýchlo, namiesto. Môj postup v mojom úloţiska (z iných dôvodov, mám súhrnom ako je uvedené nižšie):

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

Pri pohľade na toto odpoveď, snažil som sa s

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

Ale nič nezmenilo, dotaz, trvá večne, a nie očakávaný výstup. Akékoľvek nápady, prosím? Ďakujeme!

1

Najlepšiu odpoveď

0

Ak chcete zistiť, či je značky pole pole obsahuje všetkých členov youe pole, môžete použiť nižšie, ak ju budete potrebovať, ak chcete byť v agregácie potrubia druhé.

V váš dopyt máte viac etáp, a ďalší kód, ak chcete položiť viac, ak môžete dať príklad údajov a očakávaný výstup v JSON, a to, čo chcete urobiť, aby si ľudia mohli pomôcť.

Query1

  • nájsť pomocou $all prevádzkovateľ

Kód skúšky tu

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

Query2

  • agregácia riešenie nastaviť rozdiel

Kód skúšky tu

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

Ahoj Takis, ďakujem vám za vaše tipy! To, čo potrebujem, je, aby to s Java, nie cez Mongo konzoly, kde to už funguje. S MongoTemplate musel by som použiť Projekcia, a v mojom prípade by som radšej držať s Agregáciou. Kód príklady, potrebujem len na spojenie dvoch zbierok (Agregácia) a dopyt na Pole prítomné v "MyBook" kolekcie, ktoré som sa pripojiť do
Barbi

V iných jazykoch

Táto stránka je v iných jazykoch

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