Javascript 如何从ForerRunnerDB集合中选择对象的最新版本
我有一个集合,其中包含一系列随时间生成的对象。因为我在同一个集合中存储了不同的类型,所以每个对象都有一个TypeId和一个UID,其中UID标识随时间引用同一实体的对象。我试图从集合中选择最新的对象,但在掌握如何在不手动迭代查询结果的情况下实现这一点时遇到了严重的困难——我宁愿避免这一点,因为我认为当集合变得更大时,这可能会变得昂贵 例如:Javascript 如何从ForerRunnerDB集合中选择对象的最新版本,javascript,forerunnerdb,Javascript,Forerunnerdb,我有一个集合,其中包含一系列随时间生成的对象。因为我在同一个集合中存储了不同的类型,所以每个对象都有一个TypeId和一个UID,其中UID标识随时间引用同一实体的对象。我试图从集合中选择最新的对象,但在掌握如何在不手动迭代查询结果的情况下实现这一点时遇到了严重的困难——我宁愿避免这一点,因为我认为当集合变得更大时,这可能会变得昂贵 例如: var db; // assigned elsewhere var col = db.collection("res"); col.primaryKey("
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
上面的集合是人为设计的,但实际上我希望肯定会有000个条目,可能有000个条目,每个UID可能有00个版本。换句话说,我不希望返回对象的完整集合(分组或其他),并对其进行迭代
我尝试了以下方法,但由于$distinct运算符是在$orderBy one之前应用的,因此没有帮助:
col.find(
{
TypeId : {$eq : "Person"}
$distinct: { UID: 1}
},
{
$orderBy: {
resId : -1
}
}
);
我认为我应该能够使用$groupBy、$limit和$aggregate子句来标识每个组所需的ID,然后使用子查询来查找精确的非聚合元素,但到目前为止,我还没有得到任何我想要的东西。有什么想法吗
我当前的解决方案是在我的对象中包含一个已删除属性,并在插入新条目之前,将数据库中所有现有未删除对象的属性设置为true。这让我可以做我想做的事情,但也阻止了我,例如,在已知的时间范围内或类似的时间范围内选择最好的可用产品。您可以这样做:
var tmpObj = {};
col.sort({resId: -1}, coll.find({
"TypeId": "Person"
})).filter(function (doc) {
return col._match(doc, {
$distinct: {
UID: 1
}
}, {}, 'and', tmpObj);
});
它有点脏,因为它没有整齐地包装在一个命令中,但是它就像您在ForerRunnerDBv1.x中看到的一样干净
版本2将有一个新的查询管道系统,该系统将完全允许这种用法,如下所示:
col.pipeline()
.find({"TypeId": "Person"})
.orderBy({"resId": 1})
.distinct({"UID": 1})
.then(function (err, data) {
console.log(data);
});
来源:我是ForerRunnerDB的开发者