mongodb获得不同的记录
我正在使用mongoDB,其中我有以下格式的集合mongodb获得不同的记录,mongodb,mongodb-scala,Mongodb,Mongodb Scala,我正在使用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
{"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的记录,我想要这样的记录,每个id给出一条记录
在mongodb中可能吗?在mongodb中有一个独特的命令,可以与查询结合使用。但是,我相信这只会为您命名的特定键返回一个不同的值列表,也就是说,在您的情况下,您只会返回id值,因此如果您需要整个文档,我不确定这是否会为您提供所需的值-您可能需要MapReduce
关于以下方面的文件:
问题在于,您希望将3条匹配记录提取为一条,而无需在查询中提供任何逻辑来选择匹配结果 您的选项基本上是指定某种聚合逻辑,例如,为每个列选择最大值或最小值,或者运行select distinct查询,只选择希望不同的字段 很好地将这些不同的查询从SQL转换为MongoDB 例如,此SQL:
SELECT DISTINCT columnA FROM collection WHERE columnA > 5
作为此MongoDB返回:
db.runCommand({
"distinct": "collection",
"query": {
"columnA": {
"$gt": 5
}
},
"key": "columnA"
});
如果您想使用javascript在文件中写入不同的结果…这就是您要做的
cursor = db.myColl.find({'fieldName':'fieldValue'})
var Arr = new Array();
var count = 0;
cursor.forEach(
function(x) {
var temp = x.id;
var index = Arr.indexOf(temp);
if(index==-1)
{
printjson(x.id);
Arr[count] = temp;
count++;
}
})
我相信你可以像这样使用骨料
collection.aggregate({
$group : {
"_id" : "$id",
"docs" : {
$first : {
"name" : "$name",
"ttm" : "$ttm",
"val" : "$val",
}
}
}
});
您希望使用聚合。你可以这样做:
db.foo.find({"id" : {"$in" : [1,2,3]}}).sort(ttm : -1).limit(3)
db.test.aggregate[
//每个对象都是一个聚合。
{
$group:{
originalId:{$first:'$\u id'},//保留原始id。
_id:“$id”,//设置唯一标识符
val:{$first:'$val'},
名称:{$first:'$name'},
ttm:{$first:'$ttm'}
}
}, {
//这将接收来自第一个聚合的输出。
//因此,原来非唯一的“id”字段现在是
//显示为_id字段。我们要重命名它。
$项目:{
_id:“$originalId”,//还原原始id。
id:“$\u id”,//
val:“$val”,
名称:“$name”,
ttm:“$ttm”
}
}
]
这将是非常快的~90毫秒用于100000个文档的测试数据库
例如:
db.test.find
//{u id:ObjectId55fb595b241fee91ac4cd881,id:1,name:x,ttm:23,val:5}
//{u id:ObjectId55fb596d241fee91ac4cd882,id:1,name:x,ttm:34,val:1}
//{u id:ObjectId55fb59c8241fee91ac4cd883,id:1,name:x,ttm:24,val:2}
//{u id:ObjectId55fb59d9241fee91ac4cd884,id:2,name:x,ttm:56,val:3}
//{u id:ObjectId55fb59e7241fee91ac4cd885,id:2,name:x,ttm:76,val:3}
//{u id:ObjectId55fb59f9241fee91ac4cd886,id:3,name:x,ttm:54,val:7}
db.test.aggregate/*来自第一个代码段*/
//输出
{
结果:[
{
_id:Objected55FB59F9241FEE91AC4CD886,
瓦尔:7,
姓名:x,
ttm:54,
身份证号码:3
},
{
_id:Objected55FB59D9241FEE91AC4CD884,
瓦尔:3,
姓名:x,
ttm:56,
身份证号码:2
},
{
_id:Objected55FB595B241FEE91AC4CD881,
瓦尔:5,
姓名:x,
ttm:23,
身份证号码:1
}
],
好的:1
}
优点:几乎可以肯定是最快的方法
缺点:涉及使用复杂的聚合API。此外,它与文档的原始模式紧密耦合。不过,也可以对此进行概括。使用distinct指定查询。 以下示例从dept等于A的文档中返回项目字段中嵌入的字段sku的不同值:
db.inventory.distinct( "item.sku", { dept: "A" } )
参考:谢谢,是的,我想要完整的文档,但没有重复的id文档。Distinct:id返回没有重复id的完整文档。@Voldy-我无法在mongo shell中使用该语法,给我一个语法错误?@AdaTheDev我在Rails中与mongoid一起使用它。例如,这将返回包含products Category.all:id=>Deal.distinct:Category\u id的所有类别。我认为它以某种方式转换为mongo语法。@Voldy-啊,好的,谢谢,我很想知道这转换为什么-我使用CSharp驱动程序。我会再多挖一点