java中的Mongo聚合

java中的Mongo聚合,java,mongodb,aggregation-framework,mongo-java,Java,Mongodb,Aggregation Framework,Mongo Java,Hi my mongo collections包含以下文档: { "_id" : ObjectId("539efd5b254bb5f65c9da94e"), "iInfo" : [ { "ifout" : 0, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 }, { "ifout" : 0, "iferror" : 10, "ifdes" : "N/A", "ifin" : 0 },

Hi my mongo collections包含以下文档:

  {
      "_id" : ObjectId("539efd5b254bb5f65c9da94e"),
      "iInfo" : [ 
          { "ifout" : 0, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 },
          { "ifout" : 0, "iferror" : 10, "ifdes" : "N/A", "ifin" : 0 },
          { "ifout" : 0, "iferror" : 4, "ifdes" : "N/A", "ifRemotePort" : "0", "ifin" : 0 },
          { "ifout" : 0, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 } 
      ]
  }
  { 
      "_id" : ObjectId("539efd76254bb5f65c9da94f"),
      "iInfo" : [ 
          { "ifout" : 0, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 },
          { "ifout" : 0, "iferror" : 7, "ifdes" : "N/A", "ifin" : 0 },
          { "ifout" : 0, "iferror" : 4, "ifdes" : "N/A", "ifRemotePort" : "0", "ifin" : 0 },
          { "ifout" : 110, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 }
          { "ifout" : 90, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 }
      ]
  }
  {
      "_id" : ObjectId("539efed7254bb5f65c9da950"),
     "iInfo" : [ 
         { "ifout" : 10, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 }, 
         { "ifout" : 0, "iferror" : 10, "ifdes" : "N/A", "ifin" : 0 },
         { "ifout" : 0, "iferror" : 4, "ifdes" : "N/A", "ifRemotePort" : "0", "ifin" : 0 },
         { "ifout" : 0, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 }
     ] 
  }
  { 
      "_id" : ObjectId("539efeed254bb5f65c9da951"),
      "iInfo" : [
          { "ifout" : 0, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 },
          { "ifout" : 0, "iferror" : 10, "ifdes" : "N/A", "ifin" : 0 },
          { "ifout" : 0, "iferror" : 4, "ifdes" : "N/A", "ifRemotePort" : "0", "ifin" : 0 },
          { "ifout" : 100, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 },
          { "ifout" : 210, "iferror" : 0, "ifdes" : "N/A", "ifin" : 0 }
      ]
  }
现在我想对这些文档进行如下排序:

  { 
      "_id" : ObjectId("539efeed254bb5f65c9da951"),
      "iInfo" : [ 
          { "out" : 210,"iferror" : 0,"ifdes" : "N/A","ifin" : 0} 
      ]
  }
{ 
      "_id" : ObjectId("539efd76254bb5f65c9da94f"),
      "iInfo" : [ 
          { "out" : 110,"iferror" : 0,"ifdes" : "N/A","ifin" : 0} 
      ]
  }
{ 
      "_id" : ObjectId("539efeed254bb5f65c9da951"),
      "iInfo" : [ 
          { "out" : 100,"iferror" : 0,"ifdes" : "N/A","ifin" : 0} 
      ]
  }
  { 
      "_id" : ObjectId("539efed7254bb5f65c9da950"),
      "iInfo" : [
          { "out" : 90,"iferror" : 0,"ifdes" : "N/A","ifin" : 0} 
      ]
  }
{
    "_id" : ObjectId("539efeed254bb5f65c9da951"),
    "iInfo" : [ 
        { "out" : 100 }, 
        { "out" : 0 },
        { "out" : 0 }, 
        { "out" : 0 }
    ]
}
{ 
    "_id" : ObjectId("539efed7254bb5f65c9da950"),
    "iInfo" : [ 
        { "out" : 10 },
        { "out" : 0 },
        { "out" : 0 },
        { "out" : 0 }
    ]
}
{
    "_id" : ObjectId("539efd76254bb5f65c9da94f"),
    "iInfo" : [
        { "out" : 90 },
        { "out" : 0 },
        { "out" : 0 },
        { "out" : 0 } 
    ]
}
{
    "_id" : ObjectId("539efd5b254bb5f65c9da94e"),
    "iInfo" : [
        { "out" : 0 },
        { "out" : 0 },
        { "out" : 0 },
        { "out" : 0 }
    ]
}
为此,我编写了我的mongo查询,如下所示

db.demo.aggregate([
    { "$project": { "_id": 1, "out": "$iInfo.ifout"} },
    { "$unwind": "$out" },
    { "$sort": { "_id": 1, "out": -1 } },
    { "$group": { "_id": "$_id" , "iInfo": { "$push": { "out":"$out" } } } }
 ])
上述查询返回如下输出:

  { 
      "_id" : ObjectId("539efeed254bb5f65c9da951"),
      "iInfo" : [ 
          { "out" : 210,"iferror" : 0,"ifdes" : "N/A","ifin" : 0} 
      ]
  }
{ 
      "_id" : ObjectId("539efd76254bb5f65c9da94f"),
      "iInfo" : [ 
          { "out" : 110,"iferror" : 0,"ifdes" : "N/A","ifin" : 0} 
      ]
  }
{ 
      "_id" : ObjectId("539efeed254bb5f65c9da951"),
      "iInfo" : [ 
          { "out" : 100,"iferror" : 0,"ifdes" : "N/A","ifin" : 0} 
      ]
  }
  { 
      "_id" : ObjectId("539efed7254bb5f65c9da950"),
      "iInfo" : [
          { "out" : 90,"iferror" : 0,"ifdes" : "N/A","ifin" : 0} 
      ]
  }
{
    "_id" : ObjectId("539efeed254bb5f65c9da951"),
    "iInfo" : [ 
        { "out" : 100 }, 
        { "out" : 0 },
        { "out" : 0 }, 
        { "out" : 0 }
    ]
}
{ 
    "_id" : ObjectId("539efed7254bb5f65c9da950"),
    "iInfo" : [ 
        { "out" : 10 },
        { "out" : 0 },
        { "out" : 0 },
        { "out" : 0 }
    ]
}
{
    "_id" : ObjectId("539efd76254bb5f65c9da94f"),
    "iInfo" : [
        { "out" : 90 },
        { "out" : 0 },
        { "out" : 0 },
        { "out" : 0 } 
    ]
}
{
    "_id" : ObjectId("539efd5b254bb5f65c9da94e"),
    "iInfo" : [
        { "out" : 0 },
        { "out" : 0 },
        { "out" : 0 },
        { "out" : 0 }
    ]
}

那么,如何使用mongo和java代码获得所需的输出呢?

大致正确,但由于您似乎想要最高的排序值,因此您需要在以下情况下使用运算符进行过滤:

db.demo.aggregate([
//将文档与数组中的非0值匹配
{“$match”:{“iInfo.ifout”:{“$ne”:0}},
//展开阵列
{“$unwind”:“$iInfo”},
//筛选所有具有0的数组元素-同时删除所有为0的文档
{“$match”:{“iInfo.ifout”:{“$ne”:0}},
//对文档中的数组元素进行排序
{“$sort”:{“_id”:-1,“iInfo.ifout”:-1},
//每个文档只取“第一个”数组元素
{“$组”:{
“\u id”:“$\u id”,
“Iifout”:{“$first”:“$iInfo.ifout”},
“Iiferror”:{“$first”:“$iInfo.iferror”},
“Iifdes”:{“$first”:“$iInfo.ifdes”},
“Iifin”:{“$first”:“$iInfo.ifin”}
}},
//组将这些结果作为数组推送
{“$组”:{
“\u id”:“$\u id”,
“信息”:{
“$push”:{
“ifout”:“$ifout”,
“Iferor”:“$Iiferror”,
“Iifdes”:“$Iifdes”,
“Iifin”:“$Iifin”
}
}
}}
])
还要注意,您所需的输出是按降序排列的


与的聚合操作是独立的,并且您不能在“组”阶段使用子文档键,因此,如果您希望将内容作为数组返回,则需要按照第二个管道执行,如图所示,以便将值作为数组字段。

您是否使用Java驱动程序?您的查询代码是JavaScript,它将从终端运行……Hi@Kyte我也使用了java驱动器,但我希望两种查询都使用mongo和java。我在java中尝试过,但没有找到任何解决方案。这个问题可能有帮助,或者这个问题可能有助于hi-it正常工作,而不是“$sort”:{“\u id”:-11我将“$sort”:{“\u id”:-1替换为它work@yogesh只是打字错误,我一定是“胖手指”输入时会出现这种情况。@yogesh我相信是的。当有人帮你解决问题时,这里通常使用Accept和upvote。嗨,我可以在mongo中更改我的输出结构,有什么提示或帮助吗?@yogesh我看不到输出与你发布的内容有什么不同。唯一可能的区别是所有0值的文档earing.现在管道中还有其他的
$match
过滤器。