2017-07-25 62 views
0

我有以下对象,并希望得到的是有一个关键字和设备ID的所有记录。Mongo :.如何获得唯一的行

有可能是与同一设备ID多个对象。我想对于每一个设备ID的最后一个条目

{ 
    search:{ 
    keyword:"_" 
    }, 
    dateCreated:"", 
    device:[{ 
    deviceID:"_" 
    }], 

} 

例如

{ 
    search:{ 
    keyword:"FL" 
    }, 
    dateCreated:"01/01/2017", 
    device:[{ 
    deviceID:"1" 
    }], 

} 

{ 
    search:{ 
    keyword:"ATL" 
    }, 
    dateCreated:"01/02/2017", 
    device:[{ 
    deviceID:"1" 
    }], 

} 
{ 
    search:{ 
    keyword:"GA" 
    }, 
    dateCreated:"01/03/2017", 
    device:[{ 
    deviceID:"2" 
    }], 

} 

查询应返回

{ 
    search:{ 
    keyword:"ATL" 
    }, 
    dateCreated:"01/02/2017", 
    device:[{ 
    deviceID:"1" 
    }], 

} 
{ 
    search:{ 
    keyword:"GA" 
    }, 
    dateCreated:"01/03/2017", 
    device:[{ 
    deviceID:"2" 
    }], 

} 
+0

'''设备:[{设备ID: “2”}],'''为什么你存储设备ID中的设备的阵列? – styopdev

回答

0

你不能做到这一点使用“dateCreated会”,首先你需要转换“dateCreated会”栏目在(与mongo ISO日期相关的情况下)。在此之后,您可以运行以下为在你的问题中提到实现的最后一个条目

db.abc.aggregate([ 
{ 
"$unwind": "$device" 
}, 
{$group: { 
    _id: "$device", 
    search: { 
    "$max": "$search" 
    }, 
    dateCreated: { 
    "$max": "$dateCreated" 
    } 
} 
} 
]) 

,如果你正在寻找相同的JSON格式,那么你可以投射此查询,

db.abc.aggregate([ 
    { 
    "$unwind": "$device" 
    }, 
    { 
    $group: { 
     _id: "$device", 
     device: { 
     "$push": "$device" 
     }, 
     search: { 
     "$max": "$search" 
     }, 
     dateCreated: { 
     "$max": "$dateCreated" 
     } 
    } 
    }, 
    { 
    $project: { 
     search: 1, 
     dateCreated: 1, 
     device: 1, 
     _id: 0 
    } 
    } 
]) 
0

使用可以使用$elemMatch

db.collection.find({device: {$elemMatch: {deviceID:'1')}}); 

$elemMatch允许您匹配相同数组元素中的多个组件。

更多here

0

IAM不明白你的意思到底是什么,但这里的IAM给一个解决方案就是我理解的搜索关键字检查一次

db.collection.aggregate([ 
{$group:{_id:"$search.keyword",dateCreated:{$last:"$dateCreated"},device:{$last:"$device"}}},{$match:{"device.deviceID":{$ne:null}}} 
]) 

这里IAM分组,如果你愿意,你可以按这两个搜索关键字和设备以及包括通过使用$最后终于配套设备不等于最后一个设备为空日期形式