如何从云数据存储中检索子实体而不在nodejs中传递父键

时间:2019-10-03 14:43:12

标签: node.js filter google-cloud-datastore datastore datastore-admin

我有两种实体;

  • 父母
  • 孩子

在上述类型的实体中,子级与父级键相关联。

我只需要基于子键来过滤子对象,因为我没有父键,只有子键/ id。

const query = datastore.createQuery('Child')
                       .filter('__key__', '=', datastore.key(['Child', 123]))

奇怪的是,如果我传递一个“>”运算符,它将返回记录,但是我需要一个精确的键匹配以及说明。

如果必须添加一个复合索引,对于上述关系我该怎么做?

2 个答案:

答案 0 :(得分:0)

您可以看到here可以这样做,通过添加limit(1)来确保不会得到多个结果。

const Datastore = require('@google-cloud/datastore');
const datastore = new Datastore({
    projectId: 'cf-datastore',
    keyFilename: 'datastore-credential.json'
});
const kindName = 'user-log';

async  getlog = (req, res) => {
    let uid = req.query.uid || req.body.uid || 0;
    //let log = req.query.log || req.body.log || '';
    const key = datastore.key(['uid','log']);

    datastore
        .get(key,(err, entity) => {});
    const query = datastore.createQuery('uid');
    query.filter('uid', uid);
    query.limit(1);
    const transaction = datastore.transaction();
    console.log("Transaction");
    console.log(transaction);
    const results = datastore.runQuery(query, (err, entities) => {
    // entities = An array of records.

    // Access the Key object for an entity.
        firstEntityKey = entities;
        console.log("Entities")
        console.log(entities);
    });
    console.log("GOT IT");
    console.log("Results")
    console.log(results);
    //console.log("Entity");
    //console.log(entity);
    const task = await datastore.runQuery(query);
    console.log(task);
  //second part
    res.status(200).send(results);
};

exports.executed = (req, res){
  console.log(`  CALLING`);
  getlog(req, res)

  setTimeout(() => {
      resolve('resolved');
    }, 20000);
}

答案 1 :(得分:-1)

您如何分配子实体密钥ID?如果使用分配ID api,则该API不能保证跨属于不同父实体的子实体的唯一性。结果,即使使用单独的索引,您也无法唯一地查询子项。

一种方法是为顶级实体分配ID,然后将该ID用作子实体的属性。然后,您可以使用该属性进行查询,并获得与之关联的唯一子项。