Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 返回Mongo中'IN'查询的每个结果中的第一个结果_Mongodb - Fatal编程技术网

Mongodb 返回Mongo中'IN'查询的每个结果中的第一个结果

Mongodb 返回Mongo中'IN'查询的每个结果中的第一个结果,mongodb,Mongodb,我正在对我的收藏运行IN查询。 以下是我的查询结构: db.myCollection.find ( { deviceId : { $in : [ "ABC", "XYZ" .. ] } }) 我知道其中的每一行都会返回多行,但我只对每个行的第一个结果感兴趣 我查看了$first聚合函数,但认为它不适合我的情况 我可以一次对每个ID执行findOne查询,并将结果合并到用Java编写的客户机代码中。但是可能有很多这样的ID,我想减少每次的网络往返 编辑。添加一个示例以更加清晰 我收

我正在对我的收藏运行IN查询。 以下是我的查询结构:

 db.myCollection.find ( 
   { deviceId : { $in : [ "ABC", "XYZ" .. ] } 
 })
我知道其中的每一行都会返回多行,但我只对每个行的第一个结果感兴趣

我查看了
$first
聚合函数,但认为它不适合我的情况

我可以一次对每个ID执行
findOne
查询,并将结果合并到用Java编写的客户机代码中。但是可能有很多这样的ID,我想减少每次的网络往返

编辑。添加一个示例以更加清晰

我收集的样本数据:

{ "_id" : 1, "deviceSerial" : 1, "deviceId" : "ABC" }
{ "_id" : 2, "deviceSerial" : 2, "deviceId" : "XYZ" }
{ "_id" : 3, "deviceSerial" : 3, "deviceId" : "LMN" }
{ "_id" : 4, "deviceSerial" : 4, "deviceId" : "PQR" }
{ "_id" : 5, "deviceSerial" : 5, "deviceId" : "SDS" }
{ "_id" : 6, "deviceSerial" : 6, "deviceId" : "KLP" }
现在,如果我使用
{deviceId:{$in:[“LMN”,“XYZ”]}

预期输出(排序无关紧要):


因此,使用$first的想法很好。您需要使用$in筛选集合,然后消除重复项。以下聚合应该可以工作:

db.myCollection.aggregate([
    {
        $match: {
            deviceId: { $in: ["ABC", "XYZ"] }
        }
    },
    {
        $group: {
            _id: "$deviceId",
            doc: { "$first": "$$CURRENT" }
        }
    },    
    {
        $replaceRoot: { newRoot: "$doc" }
    }
])

doc将存储每个组的第一个完整文档。在最后一个阶段,我们需要将此文档升级为根文档,并且能够做到这一点。

感谢您提供的指针。当我的集合本身有一个数组时,这似乎很有用,我正在查找该数组。我的情况不同,我现在在编辑中添加了一些说明。谢谢。啊,对不起,我误解了您的问题。感谢您的编辑,最好是有示例文档和预期结果。我已经完全编辑了我的答案,现在的解决方案应该是您想要的。哇,我从来没有想到过。它是有效的!实际输出是什么样子的?使用提供的示例和查询,我可以得到准确的exp电切输出。
db.myCollection.aggregate([
    {
        $match: {
            deviceId: { $in: ["ABC", "XYZ"] }
        }
    },
    {
        $group: {
            _id: "$deviceId",
            doc: { "$first": "$$CURRENT" }
        }
    },    
    {
        $replaceRoot: { newRoot: "$doc" }
    }
])