簡體   English   中英

如何從雲數據存儲中檢索子實體而不在 nodejs 中傳遞父鍵

[英]How to retrieve a child Entity from a cloud datastore without passing a parent key in nodejs

我有兩種實體;

  • 家長
  • 孩子

在上述類型的實體中,子項與父鍵相關聯。

我需要僅基於子密鑰過濾孩子,因為我沒有父密鑰,只有子密鑰/ID。

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

奇怪的是,如果我通過一個 ">" 運算符,它將返回記錄,但是我需要一個精確的鍵匹配,以及一個解釋。

如果我必須添加一個復合索引,我將如何處理上述關系?

您如何分配子實體鍵 ID? 如果它使用分配 id api,那么 API 不能保證屬於不同父實體的子實體之間的唯一性。 結果,即使使用單獨的索引,您也無法唯一地查詢子項。

一種方法是為頂級實體分配 id,然后將該 id 用作子實體的屬性。 然后,您可以使用該屬性進行查詢並獲取與其關聯的唯一子項。

正如您在此處看到的那樣,您可以這樣做,通過添加 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM