En azından ilettiğim değerlerle eşleşen MongoTemplate Sorgu dizisi

0

Soru

Olarak tanımlanan bir Belgem varsa

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

["cool","amazing"] gibi değerlerin bir listesini iletmek için MongoTemplate ile sorgu yapabilmek ve ikincisini değil, yukarıdaki ilk koleksiyonu almak istiyorum. Elde etmek istediğim şey için, $ koşulu yeterli görünmüyor. $All koşulu ile denedim ve Mongo konsolundan ihtiyacım olan şekilde çalışıyor, ancak kodumda bir şey çalışmıyor ve sorgumun detaylandırılması sonsuza kadar sürüyor. $In operatörü ile kodum hızlı gidiyor. Depomdaki yöntemim (diğer nedenlerden dolayı, aşağıdaki gibi bir toplama yapmak zorundayım):

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

Bu cevaba baktığımda, denedim

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

Ancak hiçbir şey değişmedi, sorgu sonsuza kadar sürüyor ve beklenen çıktıyla değil. Bir fikrin var mı lütfen? Teşekkürler!

1

En iyi cevabı

0

Etiketler dizisi alanının youe dizisinin tüm üyelerini içerip içermediğini bulmak için, toplama boru hattında olması gerekiyorsa, ikincisini kullanın.

Sorgunuzda, Json'da örnek veri ve beklenen çıktı verip veremeyeceğinizi ve insanların yardımcı olabilmesi için ne yapmak istediğinizi daha fazla sormak istiyorsanız daha fazla aşama ve daha fazla kodunuz vardır.

Sorgu1

  • kullanarak bul $all operatör

Test kodu burada

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

Sorgu2

  • küme farkı ile toplama çözümü

Test kodu burada

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

Merhaba Takis, ipuçlarınız için teşekkür ederiz! İhtiyacım olan şey, zaten çalıştığı Mongo konsolu aracılığıyla değil, Java ile yapmak. MongoTemplate ile bir Projeksiyon kullanmak zorunda kalacağım ve benim durumumda Toplamaya bağlı kalmayı tercih ederim. Kod örnekleri için, sadece iki koleksiyona (Toplama) katılmam ve katıldığım "MyBook" koleksiyonunda bulunan bir Diziyi sorgulamam gerekiyor
Barbi

Diğer dillerde

Bu sayfa diğer dillerde

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