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



如果我将文档定义为

[
{
"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));

但没有任何更改,查询将花费很长时间,而且不会得到预期的输出。有什么想法吗?非常感谢。

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

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

Query1

  • 使用$all运算符查找

此处测试代码

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

Query2

  • 具有集差的聚合解决方案

此处测试代码

aggregate(
[{"$match": 
{"$expr": 
{"$eq": [{"$setDifference": [["cool", "amazing"], "$tags"]}, []]}}}])

相关内容

  • 没有找到相关文章

最新更新