我正在使用mongoDB
其中我收集了以下格式.
{"id" : 1 , name : x ttm : 23 , val : 5 } {"id" : 1 , name : x ttm : 34 , val : 1 } {"id" : 1 , name : x ttm : 24 , val : 2 } {"id" : 2 , name : x ttm : 56 , val : 3 } {"id" : 2 , name : x ttm : 76 , val : 3 } {"id" : 3 , name : x ttm : 54 , val : 7 }
在那个集合中,我查询过如下的降序获取记录:
db.foo.find({"id" : {"$in" : [1,2,3]}}).sort(ttm : -1).limit(3)
但是它给出了两个相同的记录,id = 1
我想要记录,每个记录给出1个记录id
.
在mongodb有可能吗?
distinct
mongodb中有一个命令,可以与查询一起使用.但是,我相信这只会为您命名的特定键返回一个不同的值列表(例如,在您的情况下,您只会返回返回的id值)所以我不确定这会给您完全符合您的要求需要整个文档 - 您可能需要MapReduce.
不同的文档:http: //www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct
您想使用聚合.你可以这样做:
db.test.aggregate([
// each Object is an aggregation.
{
$group: {
originalId: {$first: '$_id'}, // Hold onto original ID.
_id: '$id', // Set the unique identifier
val: {$first: '$val'},
name: {$first: '$name'},
ttm: {$first: '$ttm'}
}
}, {
// this receives the output from the first aggregation.
// So the (originally) non-unique 'id' field is now
// present as the _id field. We want to rename it.
$project:{
_id : '$originalId', // Restore original ID.
id : '$_id', //
val : '$val',
name: '$name',
ttm : '$ttm'
}
}
])
这将是非常快...〜90毫秒我的测试数据库的100,000文件.
例:
db.test.find()
// { "_id" : ObjectId("55fb595b241fee91ac4cd881"), "id" : 1, "name" : "x", "ttm" : 23, "val" : 5 }
// { "_id" : ObjectId("55fb596d241fee91ac4cd882"), "id" : 1, "name" : "x", "ttm" : 34, "val" : 1 }
// { "_id" : ObjectId("55fb59c8241fee91ac4cd883"), "id" : 1, "name" : "x", "ttm" : 24, "val" : 2 }
// { "_id" : ObjectId("55fb59d9241fee91ac4cd884"), "id" : 2, "name" : "x", "ttm" : 56, "val" : 3 }
// { "_id" : ObjectId("55fb59e7241fee91ac4cd885"), "id" : 2, "name" : "x", "ttm" : 76, "val" : 3 }
// { "_id" : ObjectId("55fb59f9241fee91ac4cd886"), "id" : 3, "name" : "x", "ttm" : 54, "val" : 7 }
db.test.aggregate(/* from first code snippet */)
// output
{
"result" : [
{
"_id" : ObjectId("55fb59f9241fee91ac4cd886"),
"val" : 7,
"name" : "x",
"ttm" : 54,
"id" : 3
},
{
"_id" : ObjectId("55fb59d9241fee91ac4cd884"),
"val" : 3,
"name" : "x",
"ttm" : 56,
"id" : 2
},
{
"_id" : ObjectId("55fb595b241fee91ac4cd881"),
"val" : 5,
"name" : "x",
"ttm" : 23,
"id" : 1
}
],
"ok" : 1
}
PROS:几乎可以肯定是最快的方法.
缺点:涉及使用复杂的聚合API.此外,它与文档的原始模式紧密耦合.虽然,有可能概括这一点.
问题是您希望将3个匹配的记录提取为1,而不在查询中提供任何逻辑,以便如何在匹配结果之间进行选择.
您的选项基本上是指定某种聚合逻辑(例如,为每列选择最大值或最小值),或者运行选择不同的查询并仅选择您希望区分的字段.
querymongo.com可以很好地为您翻译这些不同的查询(从SQL到MongoDB).
例如,这个SQL:
SELECT DISTINCT columnA FROM collection WHERE columnA > 5
以MongoDB的形式返回:
db.runCommand({ "distinct": "collection", "query": { "columnA": { "$gt": 5 } }, "key": "columnA" });
我相信你可以像这样使用聚合
collection.aggregate({ $group : { "_id" : "$id", "docs" : { $first : { "name" : "$name", "ttm" : "$ttm", "val" : "$val", } } } });