2013-07-19 186 views
0

我想在一个条件的集合列表中获取多个字段。我尝试了一个聚合请求,但我有一个错误。聚合请求MongoDB

我的要求

db.people.aggregate({$match:{createdDate:{$exists:true},"ad":"noc2"}},{$group:{value2:$value2}});

我的JSON:

 

    db.test.findOne(); 
{ 
     "_id" : ObjectId("51e7dd16d2f8db27b56ea282"), 
     "ad" : "noc2", 
     "list" : { 
       "p45" : { 
         "id" : "p45", 
         "date" : ISODate("2014-01-01T12:18:30.568Z"), 
         "value3" : 21, 
         "value1" : 100, 
         "value2" : 489 
       }, 
       "p6" : { 
         "id" : "p6" 
         "date" : ISODate("2013-07-18T12:18:30.568Z"), 
         "value3" : 21, 
         "value1" : 100, 
         "value2" : 489 
       }, 
       "p4578" : { 
         "id" : "4578" 
         "date" : ISODate("2013-07-18T12:18:30.568Z"), 
         "value3" : 21, 
         "value1" : 100, 
         "value2" : 489 
       } 
     } 
} 

我想这个JSON,例如,在结果:

{id:p45,value:587},{id:p4578,value:47},{id:p6,value:2} 
+0

你得到什么错误? –

+1

请将您的'结果'改为可读的Json。 – Schaliasos

+0

结果错误是“Fri Jul 19 12:47:05.623 JavaScript执行失败:ReferenceError:$ value2未定义” – jonn

回答

5

有几个问题与您的示例文档和聚合:

  • ,因为你是在createdDate场现有
  • 在文档级别的$group() operator作品相匹配的样本文档将不匹配您的聚集查询和
  • list场需要一个_id场组是嵌入文档,不是数组
  • 除了格式化,存在要涉及的样本值以没有明显的方式计算结果你正在寻找

这里是与list作为数组以及每个项目碰巧加起来你提到的value号码一些独特的价值调整后的示例文档:

db.people.insert({ 
     "ad" : "noc2", 
     "createdDate" : ISODate(), 
     "list" : [ 
       { 
         "id" : "p45", 
         "date" : ISODate("2014-01-01T12:18:30.568Z"), 
         "value3" : 21, 
         "value1" : 77, 
         "value2" : 489 
       }, 
       { 
         "id" : "p6", 
         "date" : ISODate("2013-07-18T12:18:30.568Z"), 
         "value3" : 20, 
         "value1" : 20, 
         "value2" : 7 
       }, 
       { 
         "id" : "4578", 
         "date" : ISODate("2013-07-18T12:18:30.568Z"), 
         "value3" : 21, 
         "value1" : 300, 
         "value2" : -319 
       } 
     ] 
}) 

您现在可以使用$unwind operator提取匹配子文档。

从当前问题描述中不清楚你想要实现的操作以及是否实际需要$group

下面是使用聚合框架来$add(总)这三个针对每个列表项值的示例:

db.people.aggregate(

    // Find relevant docs (can use index if available) 
    { $match: { 
     createdDate: { $exists:true }, 
     "ad":"noc2" 
    }}, 

    // Convert list array to stream of documents 
    { $unwind: "$list" }, 

    // Add (value1, value2, value3) for each list item 
    { $project: { 
     _id: "$list.id", 
     value: { $add: [ "$list.value1", "$list.value2", "$list.value3"] } 
    }} 
); 

输出示例:

{ 
    "result" : [ 
     { 
      "_id" : "p45", 
      "value" : 587 
     }, 
     { 
      "_id" : "p6", 
      "value" : 47 
     }, 
     { 
      "_id" : "4578", 
      "value" : 2 
     } 
    ], 
    "ok" : 1 
} 

请注意,我只使用汇总此示例为单个文档,并且输出将是list阵列中每个项目的一个结果文档。

在实际使用中,您可能希望通过文档_id或其他一些标准向$group添加额外的聚合步骤,具体取决于您尝试实现的结果。

+0

嗨,非常感谢 – jonn