Массив запросов MongoTemplate, соответствующий по крайней мере тем значениям, которые я передаю

0

Вопрос

Если у меня есть документы, определенные как

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

Я хотел бы иметь возможность запрашивать с помощью MongoTemplate, чтобы передать список значений, таких как ["круто","потрясающе"], и получить взамен первую коллекцию выше, а не вторую. Для того, чего я хочу достичь, состоянии кажется недостаточным. Я попытался выполнить условие $all, и с консоли Mongo оно работает так, как мне нужно, но в моем коде что-то не работает, и для разработки моего запроса требуется вечность. Вместо этого с оператором $in мой код работает быстро. Мой метод в моем репозитории (по другим причинам я должен выполнить агрегацию, как показано ниже):

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

Глядя на этот ответ, я попытался с

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

Но ничего не изменилось, запрос длится вечно и не с ожидаемым результатом. Есть какие-нибудь идеи, пожалуйста? Спасибо!

1

Лучший ответ

0

Чтобы узнать, содержит ли поле массива тегов все элементы вашего массива, вы можете использовать следующее, если вам нужно, чтобы оно было в конвейере агрегации, используйте второе.

В вашем запросе у вас больше этапов и больше кода, если вы хотите задать больше вопросов, можете ли вы привести примеры данных и ожидаемых выходных данных в JSON, и что вы хотите сделать, чтобы люди могли помочь.

Запрос 1

  • найти с помощью $all оператор

Тестовый код здесь

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

Запрос 2

  • решение для агрегирования с заданной разностью

Тестовый код здесь

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

Привет, Такис, спасибо тебе за твои советы! Что мне нужно, так это сделать это с помощью Java, а не через консоль Mongo, где она уже работает. С MongoTemplate мне пришлось бы использовать Проекцию, и в моем случае я бы предпочел придерживаться Агрегации. Для примеров кода мне просто нужно объединить две коллекции (агрегирование) и запросить массив, присутствующий в коллекции "Моя книга", в которую я присоединяюсь
Barbi

На других языках

Эта страница на других языках

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