gpt4 book ai didi

java - Mongodb java驱动程序如何在投影中使用过滤器

转载 作者:可可西里 更新时间:2023-11-01 10:45:32 26 4
gpt4 key购买 nike

我的这个查询在 mongodb 中运行良好:

db.document.aggregate([
{$match: { $and: [
{ type:ObjectId('abc') },
{ metadata: { $elemMatch: { metadataType: ObjectId("abc"), value: DBRef("tag", ObjectId("abc"))}}},
{ metadata: { $elemMatch: { metadataType: ObjectId("abc"), value: "abc"}}}
] }
},
{$project: {
metadata: {
$filter: {
input: "$metadata",
as: "metadata",
cond: { $or: [
{$eq: [ "$$metadata.metadataType", ObjectId("abc") ] },
{$eq: [ "$$metadata.metadataType", ObjectId("abc") ] }]}
}
}
}

我如何使用 mongodb 驱动程序在 JAVA 中执行此操作?我可以执行 $match 阶段,但我不知道如何使用数组的 $filter 执行 $project 阶段。

我可以使用 Document.parse() (就像这里建议的那样:https://groups.google.com/forum/#!topic/mongodb-user/W4wiPYk0Gec)但我认为它很丑陋。或者我可以在这里使用类似的东西:Does Spring Data MongoDb support $filter array aggregations operator?但它也不太漂亮。

基本上我的问题是:在新版本的 mongodb 驱动程序中是否有好的/更好的方法来做到这一点? (类似于 spring mongodb 的第三个答案:Query a document and all of its subdocuments that match a condition in mongodb (using spring))

***** 编辑

更准确地说:有没有办法像这里的匹配部分那样做:

AggregateIterable<Document> output = document.aggregate(
Arrays.asList(
Aggregates.match(and(
eq("type", new ObjectId("abc")),
elemMatch("metadata", and(eq("metadataType", language), eq("value", abc))),
elemMatch("metadata", and(eq("metadataType", workClusterName), eq("value", "abc")))
)),
Aggregates.project(filterHOWTO)
));

最佳答案

您可以使用 spring 的 MongoTemplate 使用 MongoTemplate#aggregate 并将其传递给 spring org.springframework.data.mongodb.core.query.Query 对象,您通过 org.springframework.data.mongodb.core.query.Criteria 构建器模式构建。 Criteria 对象具有用于 elemMatch 等的方法。Criteria 中的方法适用于您在此处发布的查询的每个方面——您只需要学习如何在 Criteria 构建器中将它们链接在一起。

关于java - Mongodb java驱动程序如何在投影中使用过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53210687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com