2016-10-23 9 views
0

私はクラスプロジェクトのためにGoogle App Engineでnode.jsを使用しています。私のコードはうまく動作するので、これを解決する方法を尋ねるのではありませんが、これは理由を除いて醜いので、この外観をきれいにするためのより良い方法が必要であると仮定しています。それは私の等級の一部ではなく、もっと良い方法を知りたいだけです。クリーンな構文でGoogle Datastoreの複数のエンティティをクエリ

私は基本的なフォーラムバックエンドを構築しましたが、フォーラムスレッドを作成するには、スレッドが一意の名前を持ち、ユーザーが存在することを確認する必要があります。後で認証を追加することを計画しますが、今のところ名前を照会するだけです。

「種類」が異なる場合、1つのクエリを使用して2つのエンティティをキーで取得する方法はありますか?このようなクエリをネストすると、すべての場所で悪いようです。この件に関して多くのドキュメントを見つけられない、または私のgoogle-fuが少し弱いです。カップルの場所でこういうことをしてください。本当にこれを特に改善したいと思います。

Basicコード

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; 
     } 
    }); 
}); 

答えて

1

クエリがKind上にあるので、あなたはKindの間で単一のクエリを実行することはできません。ただし、1つがKindがもう一方の祖先である場合、単一のクエリで両方を取得できます。たとえば、creatorThreadのプロパティであれば、それを作成したUserとして、スレッドのクエリには作成者のプロパティも含めることができます。で

より:https://cloud.google.com/datastore/docs/concepts/entities#ancestor_paths

+0

これは本当ですが、私は、キーのトランザクションを取得またはマルチ取得のような単純なクエリが正常に動作します実行していますので、私が見つけました。そうですが、すでにキーを知っている場所では、フィルターを必要としない場合に機能する照会を使用しないことによって、種類を問わずに行えます。 – user2927848

関連する問題