我有一个集合,其中包含一系列随时间生成的对象。因为我在同一个集合中存储了不同的类型,所以每个对象都有一个TypeId和一个UID (其中UID标识随着时间的推移引用相同实体的对象)。我正在尝试从集合中选择最新的对象,并且在不手动迭代查询结果的情况下遇到了严重的困难-这是我宁愿避免的,因为我认为当集合变得更大时,它可能会变得很昂贵。
例如:
var db; // assigned elsewhere
var col = db.collection("res");
col.primaryKey("resId");
col.insert({
resId: 1,
TypeId: "Person",
UID: "Bob",
Data: {Age: 20, Name:Bob}
});
col.insert({
resId: 2,
TypeId: "Person",
UID: "Bob",
Data: {Age: 25, Name:Bob}
});
col.insert({
resId: 3,
TypeId: "Car",
UID: "TeslaModelX",
Data: {Manufacturer: "Tesla", Owner:"Bob"}
});
col.insert({
resId: 4,
TypeId: "Person",
UID: "Bill",
Data: {Age: 22, Name:Bill}
});在col中,我希望查询选择TypeId="Person"按resId降序排列的所有对象,即我希望按此顺序选择对象4和2。
上面的集合是人为设计的,但在现实中,我预计肯定会有2000个条目,并且可能有000个条目,每个UID的版本可能有00个。换句话说,我不想返回完整的对象集合,不管是分组的还是其他的,然后迭代它。
我尝试了以下方法,但由于在$orderBy运算符之前应用了$distinct运算符,因此这没有什么帮助:
col.find(
{
TypeId : {$eq : "Person"}
$distinct: { UID: 1}
},
{
$orderBy: {
resId : -1
}
}
);我想我应该能够使用$groupBy、$limit和$aggregate子句来标识每个组所需的in,然后使用子查询来查找精确的(非聚合的)元素,但是到目前为止,我还没有设法获得任何东西来完成我想要的事情。有什么想法吗?
我当前的解决方案是在我的对象中包含一个Deleted属性,并在插入新条目之前将数据库中所有现有的未删除对象的属性设置为true。这让我可以做我想做的事情,但也阻止了我,例如,在已知的时间范围或类似的时间范围内选择最好的。
https://stackoverflow.com/questions/41522649
复制相似问题