【发布时间】:2015-04-15 20:38:39
【问题描述】:
我有一个 MongoDB 集合,其中包含一组文档。每个文档都有一个 ISODate date 和一个整数 id(不是 _id)。如果集合中存在字段值为{ id: X, date: D } 的文档,则称id: X 存在 为date: D。所以,例如:
{ id: 1, date: 1/1/2000 }
{ id: 1, date: 1/2/2000 }
{ id: 1, date: 1/3/2000 }
{ id: 1, date: 1/4/2000 }
{ id: 2, date: 1/2/2000 }
{ id: 2, date: 1/3/2000 }
{ id: 3, date: 1/3/2000 }
我想随着时间的推移跟踪ids,因为它们每天被创建和销毁。使用上述数据,在 2000 年 1 月 1 日至 2000 年 1 月 4 日的日期范围内:
1/1/2000: id 1 is created
1/2/2000: id 2 is created
1/3/2000: id 3 is created
1/4/2000: id 2 is destroyed
1/4/2000: id 3 is destroyed
我认为解决此问题的最佳方法是每天循环,查看今天和第二天之间存在的ids,并执行一组差异。例如,要获取 2000 年 1 月 2 日创建和销毁的 id 集,我需要在任一天的数组之间执行两个集差异:
var A = [ <ids that exist on 1/1/2000> ];
var B = [ <ids that exist on 1/2/2000> ];
var created_set = set_difference(B, A); // Those in B and not in A
var destroyed_set = set_difference(A, B); // Those in A and not in B
我可以使用find() 命令获取A 和B 的游标,但我不知道如何在两个游标之间执行set_difference。
我的另一个选择是使用聚合管道,但我无法考虑如何以可以使用 $setDifference 运算符的方式来制定管道。
作为一名 MongoDB 新手,我确信我正在以错误的方式思考问题。当然,这是可以做到的吗?我错过了什么?
【问题讨论】:
-
你的目标到底是什么?找出两个日期之间发生的所有变化?生成所有更改过的列表?
-
@jtmarmon 我的目标是为集合中找到的每个 ID 号生成创建和销毁日期的列表。上面的第二个数据列表显示了各种 id 的创建和销毁时间,这就是我所追求的。
-
日期是 ISODate 格式吗?
-
@chridam 是的,日期是 ISODate,我会用这个细节更新问题。
-
您为什么不简单地在客户端代码中解决这个问题,或者在编写更新时解决这个问题,而不是在读取时解决?在读取时执行此操作有点违反 MongoDB 哲学。如果这些游标位于不同的分片、不同的大陆或大小为 TB 怎么办?
标签: mongodb mongodb-query aggregation-framework set-difference