Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb获得不同的记录_Mongodb_Mongodb Scala - Fatal编程技术网

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

我正在使用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的记录,我想要这样的记录,每个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驱动程序。我会再多挖一点