当前位置: 首页 > 知识库问答 >
问题:

MongoTemplate查询数组,至少与我传递的值匹配

经福
2023-03-14

如果我的文档定义为

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

我希望能够使用MongoTemplate进行查询,以便传递一个值列表,如[cool]、[Aspective],作为回报,我将获得上面的第一个集合,而不是第二个集合。就我想要实现的目标而言,目前的美元条件似乎还不够。我试过使用$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个答案

黄弘深
2023-03-14

要查找标签数组字段是否包含您数组的所有成员,您可以使用下面的命令,如果您需要它在聚合管道中使用第二个。

在查询中,如果您想询问更多是否可以用JSON提供示例数据和预期输出,以及您想做什么,那么您有更多的阶段和更多的代码,以便人们能够提供帮助。

问题1

  • 使用$all运算符查找

此处为测试代码

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

查询2

  • 集差聚合解

此处为测试代码

aggregate(
[{"$match": 
    {"$expr": 
      {"$eq": [{"$setDifference": [["cool", "amazing"], "$tags"]}, []]}}}])
 类似资料:
  • 问题内容: 我正在使用Room库,具有DB Station,并想执行查询以获取具有/不具有过滤器的Station。 UPD。我有DAO,我想在我的数组(groupIds)为null或为空时获取所有记录,并且如果我在数组中有一个元素,则要获取过滤列表。 这时我遇到了一个问题 所以, 1)我可以检查要查询的null传递值并动态更改SQL查询吗? 2)如果是,我有什么语法问题? 问题答案: 交易是在SQ

  • 我有一个配置表,在其中配置select子句查询字符串,我将获得该字符串并运行NativeQuery。 我正在尝试实现一种功能,即使用spring-boot将数据库返回的值传递给本机MySQL/Hibernate查询,但在org.hibernate.exception.SqlGramMareXception:could not extract ResultSet时遇到了问题 ConfigDTO有一个

  • 问题内容: 我正在尝试对与php数组中的值匹配的行进行sql查询。 本质上我有一个像 并希望执行单个SQL查询以获取与该数组匹配的行 是否有捷径可寻?还是我必须手动构造查询字符串? 问题答案: 使用爆破功能,即

  • 我正在尝试从MongoDB中的嵌入字段数组中移除一个项。数组是类似下面的字符串类型。

  • 问题内容: 我有一些文件: 我想要得到的结果,其匹配的任何值一样 在这种情况下,我想得到结果:一个数组: 我该怎么办?谢谢。 问题答案: 您应该看一下MongoDB 中的运算符。然后将它与find一起使用,以使您的请求更快,可以使用方法:使用它,mongoDB将返回JS对象而不是Mongoose模型/对象。 然后,您可以在结果数组上使用方法: 希望对您有帮助, 最好的问候

  • 在发电机表中,我希望通过选择属性值与一组值匹配的所有项来查询。例如,我的表具有current_status属性,因此我希望所有具有“新”或“ASSIGNED”值的项。如果我对current_status属性应用GSI,看起来我必须在两个查询中执行此操作?或者进行扫描?