2016-01-08 133 views
1

用戶採集貓鼬內加入

user : { 
"_id" : md5random, 
"nickname" : "j1", 
"name" : "jany" 
} 
user : { 
"_id" : md5random, 
"nickname" : "j2", 
"name" : "jenneffer" 
} 

友誼收集

friendship : { 
    "_id" : md5rand, 
    "nick1" : "j1", 
    "nick2" : "j2", 
    "adTime" : date 
} 

例如SQL

SELECT friendship.adTime, user.name 
     FROM friendship 
INNER JOIN user ON 
     (user.nickname=friendship.nick1 or user.nickname=friendship.nick2) 

有沒有在MONGO什麼辦法讓這個SQL結果呢?

我想獲得結果,我知道mongo不支持這個請求。 但是這個更好的解決方案是什麼?任何機構都可以爲我寫一個示例嗎?

+2

[MongoDB中不支持聯接(https://stackoverflow.com/questions/4067197/mongodb-and-joins)。使用兩個查詢的結果自己執行連接。 – sdgluck

+0

@YazılımIO詢問這將是非常複雜的。您可能需要考慮更改模式,以便在mongoDB中查詢。 –

+0

好吧,我可以改變,但我仍然必須改變集合組成?以及Mongo如何查詢 –

回答

5

MongoDB是面向文檔的,不是關係數據庫。所以它沒有像SQL這樣的查詢語言。因此你應該改變你的數據庫模式。

這裏有一個例子:

  1. 定義您的架構。你不能像在sql數據庫中一樣保存mongodb中的關係。所以將朋友直接添加到用戶。要爲這些關係添加屬性,您必須創建一個新模型(這裏:Friend)。

    var userSchema = mongoose.Schema({ 
        nickname: String, 
        name: String, 
        friends: [{type: mongoose.Schema.Types.ObjectId, ref: 'Friend'}] 
    }); 
    
    var friendSchema = mongoose.Schema({ 
        user: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}, 
        addTime: Date 
    }); 
    
    var User = mongoose.Model('User', userSchema); 
    var Friend = mongoose.Model('Friend', friendSchema); 
    

您的查詢來獲取所有addTimes的看起來是這樣的:

User.find().populate('friends').exec(function(err, users) { 
    if (err) throw err; 

    var adTimes = []; 
    users.forEach(function(user) { 
     user.friends.forEach(function(friend) { 
      adTimes.push(friend.adTime); 
     }); 
    }); 

    response.send(adTimes); // adTimes should contain all addTimes from his friends 
}); 

注:上面的架構應該可行,但也許你應該使用關係(如MySQL)或圖形數據庫(如Neo4j)而不是面向文檔的數據庫,如MongoDB

2

使用$lookup,執行左外部聯接到同一個數據庫中的未加註集合,以過濾「已加入」集合中的文檔進行處理。 $ lookup階段在輸入文檔的字段與「已加入」集合的文檔中的字段之間進行平等匹配。

對於每個輸入文檔,$ lookup階段添加一個新的數組字段,其元素是來自「joined」集合的匹配文檔。 $查找階段將這些重新構建的文檔傳遞到下一個階段。

如需詳細資料點擊$lookup documentation