【问题标题】:MongoDB - Query on the last object of an array?MongoDB - 查询数组的最后一个对象?
【发布时间】:2018-05-04 13:33:21
【问题描述】:

MongoDB 中有什么方法可以在单个数据库查询中专门查询数组中最后一个对象的键值。

例如:这是我收藏的文档。

{
  "com" : [ 
    { "ts" : 1510830164203, "com" : "com1" }, 
    { "ts" : 1511242569673, "com" : "connected" },
    { "ts" : 1511244832741, "com" : "vb" } 
  ],
  "status" : [ 
    { "ts" : 1510857000000, "stat" : 3 } 
  ] 
}

如您所见,com 中有多个对象。 如何查询最后一个对象的 ts(timestamp) 或者我想检查最后一个 com 是否插入在今天的日期之间。

我已经经历过这个link. 但没有找到合适的解决方案。

如有任何帮助,我们将不胜感激。

【问题讨论】:

    标签: javascript arrays mongodb mongodb-query


    【解决方案1】:

    您可以使用$arrayElemAt 获取最后一个元素,然后在aggregation 中应用匹配。要使用$arrayElemAt 获取最后一个元素,请使用第二个值-1,它表示数组的最后一个元素。 $arrayElemAt: ["arrayName", -1]。代码会像

    db.collectionName.aggregate([
      {
        $project: {
          status: 1,
          com: {$arrayElemAt: ["$com", -1]}
        }
      },
      {
        $match: {"com.ts": 15115465465}
      }
    ])
    

    注意:如果您想比较小于或大于,请使用 like :$lt, $lte, $gt, or $gte 任何您需要的

    $match: {"com.ts": {$lt: 15115465465}}
    

    【讨论】:

    • 是的,我认为这可以解决问题。但只告诉我一件事。这个查询有多重?我的意思是我必须更频繁地使用这种查询。我希望这不会造成任何问题,对吧?
    • 是的,这不是繁重的查询,简单的查询
    【解决方案2】:
    var d1 = new Date( parseInt( "Today at 12:00 AM", 16 ) * 1000 )
    var d2 = new Date( parseInt( "Tomorrow at 12:00 AM", 16 ) * 1000 )
    
    db.table.find(
       { com: { $elemMatch: {ts:{ $gte: d1, $lt: d2 } } } })
    )
    

    【讨论】:

    • 我们可以用它作为最后一个对象的键吗?我的意思是它会在整个数组中搜索。
    • 不,我只需要满足最后一个对象键条件的对象
    • 结果将返回所有满足今天日期条件的对象。现在您可以创建一个 max() 聚合以获取最大 ts(假设最大值具有最大值)。或者您可以应用以下内容:db.table.find( { com: { $elemMatch: {ts:{ $gte: d1, $lt: d2 } } } }) )sort({ts:-1}).limit (1)
    • 你不觉得上面的聚合查询会比这更简单吗?
    • 没有更简单的方法,两者都是您问题的解决方案。
    【解决方案3】:
    db.collection.aggregate(
    
        // Pipeline
        [
            // Stage 1
            {
                $match: {
                 "_id" : ObjectId("5a197a3bde472b16ed9fc28d")
                }
            },
    
            // Stage 2
            {
                $unwind: {
                    path : "$com"
                }
            },
    
            // Stage 3
            {
                $sort: {
                 'com.ts':-1
                }
            },
    
            // Stage 4
            {
                $limit: 1
            }
    
        ]
    
    
    
    );
    

    【讨论】:

      【解决方案4】:

      如果您只需要查找最后一个元素,则可以使用以下项目查询。

      db.collection.find({},{status: 1, com:{$slice: -1}})
      

      更多类似话题的讨论here

      【讨论】:

      猜你喜欢
      • 2015-04-25
      • 2016-09-05
      • 2020-10-30
      • 2015-11-15
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多