Java MongoDB投影
我指的是mongodb官方页面的投影,在这里我遇到了以下示例,其中子文档中的数组元素被过滤: 我试图用Java实现这一点,但我做得不正确,并且子文档数组中的元素没有被过滤 输入集合:Java MongoDB投影,mongodb,mongodb-query,aggregation-framework,mongodb-java,Mongodb,Mongodb Query,Aggregation Framework,Mongodb Java,我指的是mongodb官方页面的投影,在这里我遇到了以下示例,其中子文档中的数组元素被过滤: 我试图用Java实现这一点,但我做得不正确,并且子文档数组中的元素没有被过滤 输入集合: { _id: 0, items: [ { item_id: 43, quantity: 2, price: 10 }, { item_id: 2, quantity: 1, price: 240 } ] } { _id: 1, items: [ { it
{
_id: 0,
items: [
{ item_id: 43, quantity: 2, price: 10 },
{ item_id: 2, quantity: 1, price: 240 }
]
}
{
_id: 1,
items: [
{ item_id: 23, quantity: 3, price: 110 },
{ item_id: 103, quantity: 4, price: 5 },
{ item_id: 38, quantity: 1, price: 300 }
]
}
{
_id: 2,
items: [
{ item_id: 4, quantity: 1, price: 23 }
]
}
{
"_id" : 0,
"items" : [
{ "item_id" : 2, "quantity" : 1, "price" : 240 }
]
}
{
"_id" : 1,
"items" : [
{ "item_id" : 23, "quantity" : 3, "price" : 110 },
{ "item_id" : 38, "quantity" : 1, "price" : 300 }
]
}
{ "_id" : 2, "items" : [ ] }
预期输出集合:
{
_id: 0,
items: [
{ item_id: 43, quantity: 2, price: 10 },
{ item_id: 2, quantity: 1, price: 240 }
]
}
{
_id: 1,
items: [
{ item_id: 23, quantity: 3, price: 110 },
{ item_id: 103, quantity: 4, price: 5 },
{ item_id: 38, quantity: 1, price: 300 }
]
}
{
_id: 2,
items: [
{ item_id: 4, quantity: 1, price: 23 }
]
}
{
"_id" : 0,
"items" : [
{ "item_id" : 2, "quantity" : 1, "price" : 240 }
]
}
{
"_id" : 1,
"items" : [
{ "item_id" : 23, "quantity" : 3, "price" : 110 },
{ "item_id" : 38, "quantity" : 1, "price" : 300 }
]
}
{ "_id" : 2, "items" : [ ] }
在Java(mongo Driver 3.9.1)中,我正在做以下工作:
Bson priceFilter = Filters.gte("items.price", 100);
mongoCollection.aggregate(
Aggregates.project(Projections.fields(priceFilter))
);
在需要根据某些条件从子文档数组中筛选出元素的子文档数组中,如何使用聚合函数进行投影?在MongoDB Java Driver 3.9.1中,collection.aggregate()将Java.util.List作为参数。因此,您需要用以下代码替换Java代码
mongoCollection.aggregate(
Arrays.asList(
Aggregates.project(Projections.computed("items",
new Document().append("$filter",
new Document().append("input", "$items").append("as", "item").append("cond",
new Document().append("$gte",Arrays.asList("$$item.price",100))))))
)
);
谢谢你,雷德。此代码成功运行。如果文档中有更多字段,则Aggregates.project将删除这些字段。是否有一种方法可以使所有其他字段保持不变,因为文档可能还有几个其他字段。使用Projections.include(字符串…字段名)需要将每个字段显式放在这里。根据MongoDB文档,要在输出文档中包含输入文档中的任何其他字段(而不是“\u id”字段),我们必须在$project中显式指定包含项。因此,我们在编码时也必须这样做,也就是说,我们必须使用Projections.include(字符串…字段名)。请接受我的回答,如果它已经解决了您原来的问题。谢谢RLD。我接受了你的回答。顺便说一句,MongoDB Compass有一个将聚合导出到Java、Python等语言的功能:如果我们不想将所有字段显式添加到投影中,我们可以使用$addFields和过滤器,它应该对所有现有字段具有类似的效果。谢谢Hamid。我必须检查您建议的$addFields选项。