我正在测试Mongo 2.6和拉链样本数据,我希望能够在查询时使用纬度或经度并使用聚合框架,这是我拼凑在一起的一个例子:
db.zips.aggregate([{
$project: {
_id: 1,
city: 1,
loc: 1
}
}, {
$unwind: '$loc'
}, {
$group: {
"_id": "$_id",
"city": {
$first: "$city"
},
"lat": {
$first: "$loc"
}
}
}])
$slice
完全符合我的要求,而不是$ unwind和$ group,因为我只是想从数组中提取一个特定的字段,但是你不能在聚合框架中使用它。
所以当我分组时$unwind
似乎相似,问题是$first
非常适合拾取第一个元素,而技术上它是一个2元素块,我可以使用$last
,但如果是> 2个元素,我怎么告诉它我想要2nd
元素?
===编辑===
https://jira.mongodb.org/browse/SERVER-4589
我发现这与我所追求的一致并且显然已经被打破,所以我认为我已经走到了尽头。仍然愿意接受建议。
答案 0 :(得分:0)
我知道你想在聚合函数中使用它,但我不确定它是否可行。您可以在MapReduce函数中执行此操作。它使您可以更灵活地处理数据。
以下是一个查询,您可以选择示例中的字段:
db.runCommand({
"mapreduce" : "zips",
"map" : function() {
emit(this._id, {
city: this.city,
lat: this.loc[0], // First array elem
long: this.loc[1] // Second array elem
});
},
"reduce" : function(key, values) { return values[0]; },
"out": { inline: 1 }
});
我在这里没有做任何实际的减少,因为你没有在你的问题中这样做。如果需要,您可以编辑reduce函数。