代码之家  ›  专栏  ›  技术社区  ›  user2570135

Mongo:。如何获取唯一行

  •  1
  • user2570135  · 技术社区  · 8 年前

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

    可能有多个对象具有相同的deviceID。我想要每个设备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"
      }],
    
    }
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   Atul Singh Rajpoot    8 年前

    使用“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
        }
      }
    ])
    
        2
  •  0
  •   Burdy    8 年前

    $elemMatch :

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

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

    阅读更多 here

        3
  •  0
  •   vijay kumar    8 年前

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

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