Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB投影_Mongodb_Mongodb Query_Aggregation Framework_Mongodb Java - Fatal编程技术网

Java MongoDB投影

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

我指的是mongodb官方页面的投影,在这里我遇到了以下示例,其中子文档中的数组元素被过滤:

我试图用Java实现这一点,但我做得不正确,并且子文档数组中的元素没有被过滤

输入集合:

{
   _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选项。