如果我的文档定义为
[
{
"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));
但是什么都没有改变,查询需要很长时间,并且没有预期的输出。有什么想法吗?非常感谢。
要查找标签数组字段是否包含您数组的所有成员,您可以使用下面的命令,如果您需要它在聚合管道中使用第二个。
在查询中,如果您想询问更多是否可以用JSON提供示例数据和预期输出,以及您想做什么,那么您有更多的阶段和更多的代码,以便人们能够提供帮助。
问题1
此处为测试代码
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,看起来我必须在两个查询中执行此操作?或者进行扫描?