2016-06-17 56 views
0

我想推送一个对象来指定字段的名称而不是数组。我尝试了$ push,但是我失去了关于插入到数组中的字段名称的信息。 我的收藏是:Mongo推送对象

/* 1 */ 
{ 
    "_id" : ObjectId("57614a7bd75df17df3013903"), 
    "O":"aa", 
    "D":"bb", 
    "month":1, 
    "year":2015, 
    "freq":5 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("57614a7bd75df17df3013904"), 
    "O":"aa", 
    "D":"bb", 
    "month":2, 
    "year":2015, 
    "freq":5 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("57614a7bd75df17df3013905"), 
    "O":"aa", 
    "D":"bb", 
    "month":1, 
    "year":2016, 
    "freq":5 
} 

我要存储对应于字段的所有频率:O和D. 这里是我的预期输出:

"_id" : ..., 
    "O" : "aa", 
    "D" : "bb", 
    "freq" : { 
     "2015" : { 
      "1" : 5, 
      "2":5 
     }, 
     "2016" : { 
      "1" : 5 
     } 
    } 
} 

我尝试这样做:

db.collection.aggregate([ 
{ 
    '$group': 
    { 
     _id:{"O":"$O","D":"$D","Y":"$year"}, 
       "freq" :{$push: "$freq"} 

    } 
}, 
{ 
    '$group': 
    { 
     _id:{"O":"$O","D":"$D"}, 
       "freq" :{$push: "$freq"} 

    } 
})] 

但我收到了一个没有年份或月份信息的数组。

谢谢

+1

你的JSON /样品docuemt是无效的!它会抛出解析错误,因为第1行的解析错误:{^ {id:111 ----'甚至您的预期输出不是有效的JSON。 –

+0

现在仍然无效JSON/BSON ..'错误:无法删除JSON/BSON-期待24位十六进制数字:57614a,在(2,31)'处。有了这样一个问题,你如何期望人们花时间回答? –

+0

你把生产数据库的真实数据?你为什么不向我们展示你的mongodb集合中的真实文档?可能是你的问题对任何人都不是很清楚。更好的是你问清楚的问题 –

回答

1

你用了两个$组查询

你的第一组查询,就足以打造您期待中的数据。

如果我们正在执行的第一个查询

db.stackoverflow.aggregate([ 
{ 
    '$group': 
    { 
     _id:{"O":"$O","D":"$D","Y":"$year"}, 
       "freq" :{$push: "$freq"} 

    } 
}]); 

那么结果就是现在

{ "_id" : { "O" : "aa", "D" : "bb", "Y" : 2016 }, "freq" : [ 5 ] } 
{ "_id" : { "O" : "aa", "D" : "bb", "Y" : 2015 }, "freq" : [ 5, 5 ] } 

,如果你执行你的第二个$组查询

db.stackoverflow.aggregate([ 
{ 
    '$group': 
    { 
     _id:{"O":"$O","D":"$D"}, 
       "freq" :{$push: "$freq"} 

    } 
}]) 

那么结果是

{ "_id" : { "O" : "aa", "D" : "bb" }, "freq" : [ 5, 5, 5 ] } 

原因:

第一$组查询中取出的值不传递给第二组$查询。

解决方案:

使用$项目在聚合管道沿只使用指定的字段在聚集流水线的下一级的文件传递可用。指定的字段可以是来自输入文档或新计算字段的现有字段。

https://docs.mongodb.com/manual/reference/operator/aggregation/project/


下面是该查询,让您预期的结果

db.collection.aggregate([ 
    { 
    '$group': { 
     _id: { 
     "o": "$o", 
     "d": "$d", 
     "year": "$year" 
     }, 
     myArr: { 
     $push: { 
      year: "$year", 
      month: "$month", 
      freq: "$freq" 
     } 
     } 
    } 
    }, 
    { 
    '$group': { 
     _id: { 
     "o": "$o", 
     "d": "$d" 
     }, 
     myArr1: { 
     $push: { 
      year: "$year", 
      freq: "$myArr" 
     } 
     } 
    } 
    }, 

], 
{ 
    allowDiskUse: true 
}) 
+0

与$推你会得到一个数组没有infromations月。我在找这样的东西: '{“_id”:{“O”:“aa”,“D”:“bb”},“freq”:{“2015”:{“1”:5, “2”:5},“2016”:{“1”:5}}}' 推送一个对象 我可以做$ project之后,但我不会有我在舞台$ group中丢失的月份数的informatiosn – MAYA

+0

试试这个查询它会给你月份和频率。 db.stackoverflow.aggregate {[ '$ group': { _id:{“O”:“$ O”,“D”:“$ D”,“Y”:“$ year”},myArr :{$ push:{month:“$ month”,freq:“$ freq”}} } }]) –

+0

谢谢,但它只适用于几个月,当我尝试仅通过o和d进行分组,年。我得到这个错误: '错误:getMore命令失败:{ \t“ok”:0, \t“errmsg”:“BSONObj size:35028292(0x2167D44)is invalid。Size size between 0 and 16793600(16MB)” , \t“代码”:10334 } ' 我有很多文件,我需要按O和d – MAYA