MongoDB - 查询数组的最后一个对象?
Posted
技术标签:
【中文标题】MongoDB - 查询数组的最后一个对象?【英文标题】:MongoDB - Query on the last object of an array? 【发布时间】: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. 但没有找到合适的解决方案。
如有任何帮助,我们将不胜感激。
【问题讨论】:
【参考方案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
【讨论】:
更多类似话题的讨论here 讨论在哪里? 请点击超链接或使用网址***.com/questions/28680295/…以上是关于MongoDB - 查询数组的最后一个对象?的主要内容,如果未能解决你的问题,请参考以下文章
带有 elemMatch 的 MongoDB 查询,用于从对象内部匹配嵌套数组数据 [重复]
MongoDB 聚合 - 满足所有对象数组而不是至少一个的查询集合