Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB-查询数组的最后一个对象?_Javascript_Arrays_Mongodb_Mongodb Query - Fatal编程技术网

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

Javascript MongoDB-查询数组的最后一个对象?,javascript,arrays,mongodb,mongodb-query,Javascript,Arrays,Mongodb,Mongodb Query,在MongoDB中是否有任何方法可以在单个db查询中专门查询数组中最后一个对象的键值 这是我收藏的文件 { "com" : [ { "ts" : 1510830164203, "com" : "com1" }, { "ts" : 1511242569673, "com" : "connected" }, { "ts&

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

这是我收藏的文件

{
  "com" : [ 
    { "ts" : 1510830164203, "com" : "com1" }, 
    { "ts" : 1511242569673, "com" : "connected" },
    { "ts" : 1511244832741, "com" : "vb" } 
  ],
  "status" : [ 
    { "ts" : 1510857000000, "stat" : 3 } 
  ] 
}
如您所见,com中有多个对象。 如何查询最后一个对象的ts(时间戳),或者检查最后一个com是否插入到今天的日期之间

我已经经历了这些,但没有找到合适的解决方案


非常感谢您的帮助。

您可以使用
$arrayElemAt
获取最后一个元素,然后在
聚合中应用匹配。要使用
$arrayElemAt
获取最后一个元素,请使用指示数组最后一个元素的第二个值
-1
<代码>$arrayElemAt:[“arrayName”,-1]
。代码将类似于

db.collectionName.aggregate([
  {
    $project: {
      status: 1,
      com: {$arrayElemAt: ["$com", -1]}
    }
  },
  {
    $match: {"com.ts": 15115465465}
  }
])
注意:如果您想比较like小于或大于,请使用like:
$lt、$lte、$gt或$gte
您需要的任何一个

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

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

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

更多关于类似主题的讨论

是的,我认为这可以达到目的。但是告诉我一件事。这个问题有多严重?我的意思是我必须更频繁地使用这种查询。我希望这不会引起任何问题,对吗?是的,这不是繁重的查询,简单的查询我们可以用它作为最后一个对象的键吗?我的意思是它将在整个数组中搜索。不,我只需要满足最后一个对象键条件的对象。结果将返回满足今天日期条件的所有对象。现在,您可以创建一个max()聚合来获取最大ts(假设最大值具有最高值)。或者您可以应用以下命令:db.table.find({com:{$elemMatch:{ts:{$gte:d1,$lt:d2}}}}})排序({ts:-1})。限制(1)您不认为上面的聚合查询会比这更容易吗?没有更容易的了,这两个都是您问题的解决方案。更多关于类似主题的讨论讨论讨论在哪里?请按照超链接或使用URL
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
        }

    ]



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