2016-09-21 2 views
3

ich diese verwenden, um eingebettete Dokumente zu einemneu eingebetteten Dokumente Setzen Sie sich mit Mungo

Page.findByIdAndUpdate(pageId, { 
    $addToSet: { 
    comments: { 
     $each: comments 
    } 
    } 
}, (err, page) => { 
    // ... 
}); 

Seite hinzufügen Wenn die Kommentare zu dem Page Modell hinzugefügt werden, werden sie eine id automatisch gegeben.

Ich möchte diese neu eingefügten Kommentare zurückgeben, nachdem sie eine ID erhalten haben.

Deshalb möchte ich so etwas wie

Page.findByIdAndUpdate(pageId, { 
    $addToSet: { 
    comments: { 
     $each: comments 
    } 
    } 
}, (err, page) => { 
    return page.newlyAddedComments(); 
}); 

Ich weiß, dass man Optionen, um die IDs an das Array comments hinzufügen könnte, bevor ich sie in die Datenbank einfügen, aber ich würde dies zu unterlassen wollen, wenn möglich.

+0

Haben Sie "neue" Optionen versucht? –

+1

Ich habe über die 'neue' Option gelesen. Es würde funktionieren, wenn ich die '{new: true}' Option verwenden würde und 'page.comments' zurückgeben würde, aber ich möchte nicht ALLE Kommentare zurückgeben. Ich möchte nur die neu eingefügten Kommentare – Jamgreen

+1

zurückgeben, wie ich weiß, eingebettete Dokumente allein können nicht auf Update-Ergebnis getrennt werden. –

Antwort

0

Wie @Shriram Manoharan sagte, gibt es keine Möglichkeit, das eingebettete Dokument mit einem Fund zu schneiden. Sie können es mit einem Aggregat tun, aber ich denke, dass es übertrieben ist.

Wenn Sie die letzten Dokumente erhalten:

Verwenden Neues in Ihrem Fund Option (so es die aktualisierten Daten in Seitenvariable zurückgeben)

{ new: true } 

und dann schneiden die aktualisierten Daten zurückgegeben um nur das zu bekommen, was du brauchst. (Frisch hinzugefügte Daten am Ende des Arrays sein würden)

Page.findByIdAndUpdate(pageId, { 
    $addToSet: { 
    comments: { 
     $each: comments 
    } 
    } 
}, { new: true }, (err, page) => { 
    // Do not forget, what happend if _id is wrong? 
    // if (!page) return ...; 
    return page.comments.slice(page.comments.length - comments.length - 1); 
}); 

PS: Ich sehe Sie es6 Syntax. Ich würde Ihnen empfehlen, Promises in Ihrem Code zu implementieren. Ich denke, es verbessert das Lesen und vereinfacht die Verkettung von Funktionen.

Page.findByIdAndUpdate(pageId, { 
     $addToSet: { 
     comments: { 
      $each: comments 
     } 
     } 
    }, { new: true }) 
    .then(page => page.comments.slice(page.comments.length - comments.length - 1)) 
    .then(page => ...) 
    .catch(err => ...); 
+0

Danke! Was ist das zweite '.then()' für? Hast du es hinzugefügt, um mir zu zeigen, dass ich mehrere 'then()' verketten kann? Aber wann wäre es sinnvoll den 'then()' Block zu wiederholen? – Jamgreen

+0

Ist es nicht sehr langsam, alle Kommentare zu erhalten, sie zu zählen und ein Element zu entfernen? – Jamgreen

+0

Yeah das zweite 'then' ist, wo du andere Dinge tun kannst. Wenn es lang ist (viele Daten in einem Dokument), machen Sie ein Aggregat. Aber 99% der Fälle speichern Sie nicht viele Daten in einem verschachtelten Array in einem Dokument. –

Verwandte Themen