2017-06-20 4 views
1

.findOne()を使用してmongodbのフィールドにアクセスしようとしていた流星のパブリケーションがあります。しかし、私は流星から.findOne()を返すことができないので、私は現在.find()だけを使用しています。問題は、ドキュメントの代わりにカーソルを返すので、パブリッシュ関数でそのカーソル内の値を読み取ることができないということです。カーソルが生成された同じパブリケーション内のmongodbカーソルから値を読み取る方法

以下

は私のMongoDBのクエリ

var question = Question.find({ "_id": quesId }, 
    { fields: {"pages": 1, "settings.name": 1, "status": 1 }}, 
    {limit: 1}); 

であると私はあなたのカーソルにオブザーバを設定することができ、同じパブリッシュ機能

答えて

0

の内側に上記のクエリから取得pagesの値を使用したいと結果にフックをつけてください。私は結果を変換するために頻繁にそれを行います。

let cursor = Question.find({ "_id": quesId }, { "pages": 1, "settings.name": 1, "status": 1 }, {limit: 1}); 

let handle = cursor.observeChanges({ 
    added: (id, fields) => { 
     // look at fields 
     this.added('questions', id, fields); 
    }, 
    changed: (id, fields) => { 
     // look at fields 
     this.changed('questions', id, fields); 
    }, 
    removed: (id) => { 
     this.removed('questions', id); 
    } 
}); 

this.ready(); 

this.onStop(() => { 
    handle.stop(); 
}); 

これが後の初期に追加公開、および変更されたレコードにあなたのフックを与えるだろう(私は名前を公表することを前提に作っていますが「質問」です)。パブリケーションの公開準備ができたらready()を呼び出します(サンプルのthis.ready()を見ることができます)。

0

あなたの質問を理解する限り、あなたのコードに冗長なfindOne()を入れずに、カーソル内の単一のドキュメントにアクセスしたいと思っています。カーソル上に.fetch()の配列に結果を変換し、最初のエントリを[0]としてからpages属性を直接取得することができます。 _idで検索するときに、あなたが直接あなたがフィルタパラメータとして上の検索したい値を使用することができ、あなたのフィルターで{_id: quesId}を指定する必要がないことも

const question = Question.find(quesId, 
    { fields: { "pages": 1, "settings.name": 1, "status": 1 }}); 
const pages = question.fetch()[0].pages; 

注意、モンゴは、あなたが検索していることを前提としてい_id。さらに、{limit: 1}は、スカラー_idの値を検索しているため、カーソルの長さが1になることが保証されているため、冗長です。

関連する問題