【问题标题】:query multiple entities in Google Datastore with a clean syntax使用简洁的语法查询 Google Datastore 中的多个实体
【发布时间】:2016-10-23 01:22:46
【问题描述】:

我将 node.js 与 Google App Engine 一起用于类项目。我的代码工作正常,所以我不是在问如何解决这个问题,但这太难看了,我假设必须有更好的方法让这个看起来干净。那不是我成绩的一部分,只是想知道更好的方法。也总是希望减少往返次数,所以

我已经建立了一个基本的论坛后端,但创建论坛线程的一部分是我需要检查线程具有唯一的名称以及用户是否存在。计划稍后添加身份验证,但现在只是查询名称。

如果它们属于不同的“种类”,有没有办法使用单个查询按键获取 2 个实体?像这样的嵌套查询似乎很糟糕。没有找到很多关于这个主题的文档,或者我的 google-fu 有点弱。在几个地方做这样的事情,所以特别想改进一下。

基本代码

router.post('/', function (req, res) {

    if (req.body["Name"] == null || typeof req.body["Name"] !== "string")
    {
        res.json({ success: false, data: "Name was not a valid string." });
        return;
    }

    if (req.body["Creator"] == null || typeof req.body["Creator"] !== "string")
    {
        res.json({ success: false, data: "Invalid creator submitted for thread creation." });
        return;
    }

    //See if thread is unique
    var query = datastore.createQuery('Thread')
        .filter('__key__', '=', datastore.key(['Thread', req.body["Name"]]));

    datastore.runQuery(query, function (err, entities, nextQuery) {

        //
        if (err == null && entities.length == 0) {

            var query2 = datastore.createQuery('User')
                .filter('__key__', '=', datastore.key(['User', req.body["Creator"]]));

            datastore.runQuery(query2, function (err2, entities2, nextQuery) {

                if (err2 == null && entities2.length >= 1)
                {
                    var threadKey =
                        {
                            name: req.body["Name"],
                            kind: "Thread",
                            path: ["Thread", req.body["Name"]]
                        }

                    var threadData =
                        {
                            Creator: req.body["Creator"],
                            DateCreated: new Date(),
                            LastUpdated: new Date()
                        }

                    datastore.upsert({
                        key: threadKey,
                        data: threadData
                    }, function (err) {

                        if (err) {
                            res.json({ success: false, data: "Was unable to add value to datastore for unknown reason." });
                            return;
                        }
                        else {
                            res.json({ success: true, data: "Was able to add thread to datastore." });
                            return;
                        }
                    });
                }
                else
                {
                    res.json({ success: false, data: "Cannot create thread because a valid user was not submitted." });
                    return;
                }
            });
        }
        else {
            res.json({ success: false, data: "Cannot create thread because a matching name already exists." });
            return;
        }
    });
});

【问题讨论】:

    标签: google-app-engine google-cloud-datastore


    【解决方案1】:

    由于查询在 Kind 上,因此您无法跨 Kinds 运行单个查询。但是,如果一个Kind 是另一个的祖先,那么单个查询可以同时获取两者。例如,如果creatorThread 的属性,作为创建它的User,那么线程上的查询也可以包含创建者的属性。

    更多信息:https://cloud.google.com/datastore/docs/concepts/entities#ancestor_paths

    【讨论】:

    • 这是真的,但是由于我正在运行这样一个简单的查询来获取密钥,因此我发现事务或多获取可以正常工作。确实如此,但是对于您已经知道键的地方,您可以通过不使用在不需要过滤器时有效的查询来遍历种类。
    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多