MongoTemplate查询阵列比赛至少值我通过

0

的问题

如果我有一个文件的定义为

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

我想要能够查询与MongoTemplate为了通过列表的价值观,如["酷","惊人的"],并在返回的第一个收集上,而不是第二次。 为什么我的意思是实现, 美元 的条件似乎不够的。 我试图与 $所有 条件,从Mongo控制台,它的工作因为我需要的,但在我的代码什么不工作和它永远对我的查询,以阐述。 用 美元 操作我的代码转速度快,而不是。 我的方法在我的储存库(由于其他原因,我必须做的一个聚合作下):

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

找到,如果标阵列领域包含的所有成员的汽车阵列,您可以使用的波纹管,如果你需要在聚集管线的使用。

在您的询问你有多个阶段,并更多的代码,如果你想要询问更多的如果你可以给例的数据和预期产出式,并什么你想要做,所以人们可以提供帮助。

1

  • 找到使用 $all 操作员

测试的代码这里

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

Query2

  • 集合解决方案的一套差异

测试的代码这里

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

嗨塔基,感谢您的提示! 我需要的是这样做与Java,而不是通过蒙戈控制台在那里已经工作。 与MongoTemplate我不得不使用投影,在我的情况下,我宁愿坚持使用的聚集。 用代码的例子,我只需要参加两个集合(聚集)和查询在一系列存在"什么要选择"收集的,我加入到
Barbi

其他语言

此页面有其他语言版本

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