簡體   English   中英

將新項目推送到mongoDB文檔數組

[英]Pushing new item to a mongoDB document array

我瀏覽了許多其他的SO帖子,並找到了不同的方法來執行此操作,所以我想知道哪個是最優選的。 我正在教學生,所以我想給他們最佳實踐。

如果我有以下BlogPost對象(簡體):

var BlogPostSchema = new mongoose.Schema({
    body: String,
    comments: [String]
});

並且我想在此博客的評論數組中添加新評論,我可以想到至少三種主要方法來實現:

1)將注釋推送到Angular中的博客對象,然后向/blogs/:blogID端點提交PUT請求,並使用新的注釋更新整個博客對象。

2)將POST請求提交到/blogs/:blogID/comments端點,其中請求主體只是新注釋,找到博客,將注釋推送到vanilla js中的數組,然后保存:

BlogPost.findById(req.params.blogID, function(err, blogPost) {
    blogPost.comments.push(req.body);
    blogPost.save(function(err) {
        if (err) return res.status(500).send(err);
        res.send(blogPost);
    });
});

要么

3)使用新注釋的請求正文將POST提交到/blogs/:blogID/comments端點,然后使用MongoDB的$push$addToSet將注釋添加到注釋數組:

BlogPost.findByIdAndUpdate(
    req.params.blogID,
    {$push: {comments: req.body}},
    {safe: true, new: true},
    function(err, blogPost) {
        if (err) return res.status(500).send(err);
        res.send(blogPost);
    });
});

我確實找到了這個stackoverflow帖子 ,回答者在其中討論了選項2與選項3,並且基本上說要盡可能使用選項2,這對我來說似乎更簡單。 (而且我通常會嘗試避免使我無法使用鈎子和其他貓鼬禮物的方法。)

你怎么看? 有什么建議嗎?

從應用的角度來看,第3點更好。 我認為是這樣。

  1. 查詢本身指定了我們要實現的目標。 它很容易閱讀。
  2. 保存功能是通配符,因此我們不知道它會發生什么變化。
  3. 如果您獲取文檔並對其進行操作然后調用save,那么在操作過程中您可能會無意中弄亂了文檔的其他字段,但在第三點卻並非如此。
  4. 如果使用addToSet,則基本上可以看到上一點。
  5. 考慮一下並發性,如果同一博客的多個調用帶有不同的注釋,而您正在嘗試選項2,則有可能會覆蓋在獲取文檔和保存文檔之間所做的更改。 從這個意義上講,選項3更好。

在性能方面,它們都做相同的事情,因此可能沒有太多差異或任何明顯的差異。 但是選項3更安全,更清潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM