2016-11-15 1 views
0

Ich muss eine Veröffentlichung erstellen, die mir eine Reihe von Dokumenten aus der Sammlung gibt. Hier können Sie sehen, wie die Dokumente miteinander verwandt sind:MongoDB: Wie bekomme ich Hauptdokument und alle Vorfahren

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

Also, was ich weiß, dass die ID des ersten Dokuments ist und ich brauche auch alle Vorfahren in der Publikation.

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

Klingt wie Sie das Hauptdokument mit 'ziehen müssen {_id: id} 'und ziehen Sie anschließend die Vorfahren aus dieser Eigenschaft –

Antwort

1

Sie müssen eine .findOne() zuerst tun dann eine Reihe von Cursor zurück:

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

Sie auch diese mit einem einzigen .find() tun könnte eine $or verwenden, aber das wahrscheinlich langsamer sein würde.

+0

Es gibt eine fehlende') 'in' ... Vorfahren}}] '. Und sollte es nicht ein Komma im Array sein, anstatt ein Semikolon? – user3142695

+0

Absolut korrekt! Und jetzt korrigiert. –

0

Sie könnten dies publish-composite veröffentlichen Beziehung in Meteor beitreten:

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

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

Dieses Paket stellt sicher, dass Ihre veröffentlichen reaktiv ist, beispielsweise Wenn der Wert ancestors sich ändert, sollten die auf den Client publizierten Daten aktualisiert werden, um diese Änderung widerzuspiegeln. Wenn Sie nur findOne in der Publikation verwenden, um die ancestors Liste zu bekommen, dann werden die an den Client gesendeten Daten werden nicht aktualisiert, wenn der Wert von ancestors Änderung

Verwandte Themen