簡體   English   中英

查詢多對多關系mongodb數據庫結構

[英]query on many to many relation mongodb database struct

我在MongoDB中有兩個集合:一個集合保存博客的帖子數據,另一個集合使用以下模式保存博客的評論數據。 如何使用nodejs和mongoose查詢所有帶有注釋的帖子,並響應單頁應用程序? 謝謝!

var PostSchema = mongoose.Schema({
    created: {
        type: Date,
        default: Date.now
    },
    content: {
        type: String,
        default: '',
        trim: true
    },
    user: {
        type: Schema.ObjectId,
        ref: 'user'
    }
 }); 

 var CommentSchema = mongoose.Schema({
    created: {
        type: Date,
        default: Date.now
    },
    content: {
        type: String,
        default: '',
        trim: true
    },
    ofpost: {
        type: Schema.ObjectId, 
        ref: 'post'           //which post this comment belong to
    },
    user: {
        type: Schema.ObjectId,
        ref: 'user'
    }
 }); 




    var Post = mongoose.model('Post', PostSchema);
    var Comment = mongoose.model('Comment', CommentSchema); 

//example:the Comment1 and Comment2 belong to Post1
    var Post1 = new Post({ content: 'good day', user: 'John' });
    var Comment1 = new Comment({content: 'yeah', ofpost: Post1._id, user:'Tom'})
    var Comment2 = new Comment({content: 'agree', ofpost: Post1._id, user:'Tina'})

由於mongodb是NoSQL類型的數據庫,並且沒有JOIN或文檔之間的任何類型的關系,因此您必須注意這一點。
通常有兩種方法可以這樣做:

高速緩存
考慮在博客文檔中存儲評論數據。 您可以毫無問題地嵌入文檔。 實際上,它會導致一些額外的緩存,例如注釋計數,注釋的用戶ID數組以及其他一些東西,這些東西將使您的查詢成為索引,並且是更簡單的方式來搜索集合。

多重查詢
如果仍然需要單獨的集合,則需要“模擬”聯接。 最有效的方法是對不同的集合建立臨時索引數組和多個查詢。 通常,對於一個Join(很多到很多),它應該只有2個查詢,並且需要進行小的迭代才能將第二個查詢文檔添加到第一個文檔數組中。

例如,這是合適的並且仍然表現良好的流程:
有兩個集合,第一個是posts ,第二個是具有post idcomments

  1. 查詢帖子。
  2. 遍歷每個post並將其id添加到postIds數組中,並制作postMap對象,其中key將為post的idvalue將為特定的post -這就是所謂的索引站。
  3. 使用$in參數和帖子ID的postIds數組對comments集合進行查詢。 為了使此查詢非常有效,此集合應在post id字段上建立索引。 同樣,此查詢可以包括按日期排序(附加的復合索引將加快日期排序)。
  4. 遍歷每個評論,並使用postMap將其添加到發布的評論數組中。

因此,我們只有2個查詢,並通過所有注釋進行一次迭代,以將數據嵌入到帖子O(n)中。 如果沒有第二步,則添加到帖子中的可能性可能為O(p * c),其中p-帖子數和c-評論數。 在大查詢上,這顯然也要慢得多,而且可能會很慢。

摘要
從數據的角度來看,第二種方法是更易於管理的方法,在writes時更容易,而在reads時更復雜。
仍然需要一些緩存,例如博客文章的評論數量。

暫無
暫無

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

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