2017-11-01 28 views
1

Firestoreを使用してキューとして動作するアプリケーションがあります。別のソースからデータが入ってFirestoreに/data/{id}で保存され、プロパティーはunprocessedがtrueに設定されています。私のNode.jsスクリプトでは、これらの未処理レコードを一度にいくつかクエリしてゆっくりと処理したいと思っています。何十万ものレコードがあるので、それらをすべてメモリにロードしようとすると、プロセスがクラッシュします。Firestoreのクエリで.limit()を使用する

コード:

firestore.collection('data').where('unprocessed', '==', true).limit(25).onSnapshot((snapshot) => { 
    snapshot.forEach((doc) => { 
     processItem(doc); 
    }); 
    }); 

processItem()関数がfalseに設定unprocessedプロパティバックFirestoreにデータを保存し、必要な処理を行います。

私はに実行している問題は、私はこのコードを実行しようとする任意の時間が、私は次のエラーを取得することです:私のコードから.limit()を削除

Error: Error 3: Order must include __name__ 
    at sendError (C:\[myApp]\node_modules\@google-cloud\firestore\src\watch.js:254:15) 
    at DestroyableTransform.stream.on.proto (C:\[myApp]\node_modules\@google-cloud\firestore\src\watch.js:532:13) 
    at emitOne (events.js:115:13) 
    at DestroyableTransform.emit (events.js:210:7) 
    at addChunk (C:\[myApp]\node_modules\readable-stream\lib\_stream_readable.js:284:12) 
    at readableAddChunk (C:\[myApp]\node_modules\readable-stream\lib\_stream_readable.js:271:11) 
    at DestroyableTransform.Readable.push (C:\[myApp]\node_modules\readable-stream\lib\_stream_readable.js:238:10) 
    at DestroyableTransform.Transform.push (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:146:32) 
    at afterTransform (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:102:51) 
    at TransformState.afterTransform (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:79:12) 
    at DestroyableTransform.noop [as _transform] (C:\[myApp]\node_modules\through2\through2.js:26:3) 
    at DestroyableTransform.Transform._read (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:182:10) 
    at DestroyableTransform.Transform._write (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:170:83) 
    at doWrite (C:\[myApp]\node_modules\readable-stream\lib\_stream_writable.js:406:64) 
    at writeOrBuffer (C:\[myApp]\node_modules\readable-stream\lib\_stream_writable.js:395:5) 
    at DestroyableTransform.Writable.write (C:\[myApp]\node_modules\readable-stream\lib\_stream_writable.js:322:11) 

はそれを実行しますが、その後、私は実行アイテムを処理して格納する関数が正しく終了していないという別の問題が発生し、プロセスがクラッシュするまでメモリの使用量が増えています。

私の本能は、.limit()が何らかの理由で.onSnapshot()と互換性がないと考えることですが、おそらく誰かが私にここで何が起こっているのかをより良く知ることができます。

編集私もhttps://firebase.google.com/docs/firestore/manage-data/delete-dataに示すように(「削除コレクション」セクションで)、.orderBy('__name__')に追加しようとしましたが、これはまだ別のエラーになり

Error: Trying to compare documents on fields that don't exist. Please include the fields you are ordering on in your select() call. 
    at C:\[myApp]\node_modules\@google-cloud\firestore\src\reference.js:1679:19 
    at Array.sort (native) 
    at computeSnapshot (C:\[myApp]\node_modules\@google-cloud\firestore\src\watch.js:438:20) 
    at push (C:\[myApp]\node_modules\@google-cloud\firestore\src\watch.js:469:18) 
    at DestroyableTransform.stream.on.proto (C:\[myApp]\node_modules\@google-cloud\firestore\src\watch.js:514:15) 
    at emitOne (events.js:115:13) 
    at DestroyableTransform.emit (events.js:210:7) 
    at addChunk (C:\[myApp]\node_modules\readable-stream\lib\_stream_readable.js:284:12) 
    at readableAddChunk (C:\[myApp]\node_modules\readable-stream\lib\_stream_readable.js:271:11) 
    at DestroyableTransform.Readable.push (C:\[myApp]\node_modules\readable-stream\lib\_stream_readable.js:238:10) 
    at DestroyableTransform.Transform.push (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:146:32) 
    at afterTransform (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:102:51) 
    at TransformState.afterTransform (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:79:12) 
    at DestroyableTransform.noop [as _transform] (C:\[myApp]\node_modules\through2\through2.js:26:3) 
    at DestroyableTransform.Transform._read (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:182:10) 
    at DestroyableTransform.Transform._write (C:\[myApp]\node_modules\readable-stream\lib\_stream_transform.js:170:83) 
+1

実験として、 '.orderBy( '​​unprocessed')'をクエリに追加してください。 –

+0

@BobSnyder '.orderBy( '​​未処理')'を追加すると、エラーが若干異なります: 'エラー3:order by句には等値フィルタが未処理のフィールドを含めることはできません。 ' –

+1

' .orderBy(... ) 'を使用して作業します(https://firebase.google.com/docs/firestore/query-data/order-limit-data)。 –

答えて

2

の場合.orderBy(FirebaseFirestore.FieldPath.documentId())を追加すると、問題を修正するはずです。この問題がなぜ修正されるのかの簡単な説明はhereです。例のgistがあります。

関連する問題