【发布时间】:2020-11-27 20:07:12
【问题描述】:
我正在处理一个非常奇怪的案例,即 Mongo 中的聚合。我有一个非常标准的集合,具有以下架构/字段:
{
price: Number,
conneected_realm_id: Number, /** <= destination or warehouse pointer */
item.id: Number, /** Some kind of SKU */
last_modified: Number /** Unix timestamp, the latest documents has greater results, always */
}
我的聚合查询,我一直很确定,给我返回了一个 -latest results,但据我现在理解,它实际上没有。
问题:
集合接收实时数据,并将其存储。每个item 和他自己的connected_realm_id 字段(这个仓库/指向的数据)都有自己独特的时间戳。就像这样:
item: 168652
in warehouses: 1602 | 1063
timestamps: -latest for each
7 5
4 3 /** <= this are outdated timestamps */
2 1 /** <= and so is this */
所以,通过我在 MongoPlayground 中的聚合,我想接收以下数据
All original documents with:
item: 168652
groupedBy: { 1602 and 7 }, { 1603 and 5 } /** latest ($max) timestamps for each warehouse */
相反,我会收到每个仓库的每个唯一时间戳,但我不需要它。那么,问题来了:下面的数据能不能实现?
更多信息:
- Mongo v4.2,所以我可以使用几乎所有运算符,除了
$replaceOne - 我知道,我可以通过发出 N(仓库计数)请求或通过
.eachAsync来解决这个问题,但这不是解决方案,因为我有 200 多个仓库。我能够在我的查询中再添加一个阶段(足够长,相信我),但我无法使用{$match: { connected_realm_id: value, last_modified: -latest } }向 DB 发出 N 请求 - 集合已经有索引,其中一个是
compoundbyconnected_realm_id && last_modified,所以如果我使用$match或.find(),我会收到来自数据库的预排序值。 - 需要明确的是,这一切都是关于保存/过滤默认的
$$ROOT文档。所以我不需要接收每个仓库的最新时间戳。我可以通过另一种更有效的方式接收这些数据,重点在于过滤/保存{data: $$ROOT}字段
【问题讨论】:
标签: javascript mongodb mongoose mongodb-query aggregation-framework