2016-11-15 2 views
0

私はコレクションからドキュメントを取得するためのパブリケーションを作成する必要があります。ここでは、文書が互いにどのように関連しているか、確認できますMongoDB:メイン文書とすべての祖先を取得するには

{ 
    "_id" : "peRuJcPMDzZgTvWSX", 
    "author" : "author", 
    "type" : "article", 
    "parent" : "mnfTFfZ7Fqcu6ZJ7T", 
    "ancestors" : [ "hbSycmNNvmdqvpchX", "mnfTFfZ7Fqcu6ZJ7T" ] 
} 
{ 
    "_id" : "mnfTFfZ7Fqcu6ZJ7T", 
    "article" : "article", 
    "parent" : "hbSycmNNvmdqvpchX", 
    "ancestors" : [ "hbSycmNNvmdqvpchX" ] 
} 
{ 
    "_id" : "hbSycmNNvmdqvpchX", 
    "title" : "title", 
    "ancestors" : [ ] 
} 

それでは、私が知っていることは最初の文書のIDであり、私はまた、パブリケーション内のすべての祖先を必要としています。

あなたはカーソルの配列を返し、その後 .findOne()最初に行う必要があります
Meteor.publish('list', function(id) { 
    check(id, String); 
    return Collection.find({}); // WRONG: gives me ALL documents 
    return Collection.find({ _id: id }) // WRONG: gives me only the first document (main) 
    // NEEDED: Main document and all ancestors 
}); 
+0

の値が鳴ったときに、クライアントに送信されたデータは更新されません'と先祖がそのプロパティから先祖を引き出す –

答えて

1

Meteor.publish('list', function(id) { 
    check(id, String); 
    const ancestors = Collection.findOne(id).ancestors; 
    if (ancestors){ 
    return [ Collection.find(id), Collection.find({_id: {$in: ancestors}})]; 
    } else { 
    return Collection.find(id); 
    } 
}); 

また$orを使用して、単一.find()でこれを行うことができますが、それはおそらく遅くなるでしょう。

+0

' ... ancestors}}] 'に') 'がありません。また、セミコロンではなく、配列内のコンマであってはなりませんか? – user3142695

+0

絶対に正しい!そして今修正されました。 –

0

あなたはこのpublish-compositeは流星で関係に参加する公開することができます:

Meteor.publishComposite('list', function(id) { 
    // checking here ... 

    return { 
    find() { 
     return Collection.find(id); 
    }, 
    children: [{ 
     find(doc) { 
     return Collection.find({ 
      _id: { 
      $in: doc.ancestors 
      } 
     }); 
     }, 
    }], 
    }; 
}); 

このパッケージには、あなたの公開が反応性であることを確認し、例えばancestorsの値が変更された場合、クライアントに公開されたデータは、その変更を反映するように更新する必要があります。あなただけのancestorsリストを取得するために出版物にfindOneを使用している場合は、 `{:ID _id}とメイン文書をプルする必要がありますようにancestors変更

関連する問題