蒙戈:.如何获得唯一的行

时间:2017-07-25 11:38:55

标签: mongodb

我有以下对象,并希望获得所有包含关键字和deviceID的记录。

可能有多个具有相同deviceID的对象。我想要每个设备ID的最后一个条目

{
  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"
  }],

}

查询应该返回

from module1 import *

def func1:
    ...
def func2:
    ...
...

3 个答案:

答案 0 :(得分:0)

使用可以使用$elemMatch

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

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

了解更多here

答案 1 :(得分:0)

我完全不明白你的意思,但在这里我给了一个我理解的解决方案一次检查

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

这里iam按搜索关键字分组如果你想要你可以通过搜索关键字和设备进行分组,并使用$ last包含最后一个设备,最后匹配设备不等于null

答案 2 :(得分: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
    }
  }
])