【问题标题】:How can I select the latest version of an object from a ForerunnerDb collection如何从 ForerunnerDb 集合中选择对象的最新版本
【发布时间】:2017-01-07 14:45:12
【问题描述】:

我有一个集合,其中包含随时间生成的一系列对象。由于我在同一个集合中存储了不同的类型,因此每个对象都有一个 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。

上面的集合是人为的,但实际上我希望肯定有 000 个条目,并且可能有 0000 个条目,每个 UID 可能有 00 个版本。换句话说,我宁愿不返回对象的完整集合,无论是分组的还是其他的,然后迭代它。

我尝试了以下方法,但由于 $distinct 运算符在 $orderBy 之前应用,这无济于事:

col.find(
    {
        TypeId : {$eq : "Person"}
        $distinct: { UID: 1}
    },
    {
        $orderBy: {
            resId : -1
        }
    }
    );

我想我应该能够使用 $groupBy$limit$aggregate 子句来识别每个组所需的 ID,然后使用子查询来查找精确的(非聚合)元素,但到目前为止我还没有设法做任何我想做的事。有什么想法吗?

我当前的解决方案是在我的对象中包含一个Deleted 属性,并在我插入新条目之前为数据库中所有现有的未删除对象将其设置为 true。这让我可以做我想做的事,但也会阻止我,例如,在已知的时间范围内或类似的时间范围内选择最好的。

【问题讨论】:

    标签: javascript forerunnerdb


    【解决方案1】:

    你可以这样做:

    var tmpObj = {};
    col.sort({resId: -1}, coll.find({
        "TypeId": "Person"
    })).filter(function (doc) {
        return col._match(doc, {
            $distinct: {
                UID: 1
            }
        }, {}, 'and', tmpObj);
    });
    

    它有点脏,因为它没有整齐地包含在一个命令中,但它和你在 ForerunnerDB v1.x 中得到的一样干净。

    版本 2 将有一个新的查询管道系统,该系统将完全允许这种用法,如下所示:

    col.pipeline()
        .find({"TypeId": "Person"})
        .orderBy({"resId": 1})
        .distinct({"UID": 1})
        .then(function (err, data) {
            console.log(data);
        });
    

    来源:我是 ForerunnerDB 的开发者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多