MongoDB - 查询数组的最后一个对象?

时间:2017-11-21 07:05:14

标签: javascript arrays mongodb mongodb-query

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

例如:这是我在集合中的文档。

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

因此,您可以看到 com 中有多个对象。 如何查询最后一个对象的ts(时间戳)或者我想检查是否在今天的日期之间插入最后一个com。

我已经完成了这个link.但是找不到合适的解决方案。

任何帮助都可以表示赞赏。

4 个答案:

答案 0 :(得分:2)

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

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

N.B:如果你想比较小于或大于,那么使用像:$lt, $lte, $gt, or $gte你需要的任何一个

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

答案 1 :(得分:0)

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 } } } })
)

答案 2 :(得分:0)

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
        }

    ]



);

答案 3 :(得分:0)

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

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

有关类似主题here的更多讨论