簡體   English   中英

貓鼬內聯

[英]Mongoose Inner Join

用戶集合

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不支持此請求。 但是這個更好的解決方案是什么? 任何人都可以為我寫一個例子嗎?

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

使用$lookup ,對同一數據庫中的未分片集合執行左外部聯接,以從“聯接”集合中過濾文檔以進行處理。 $ lookup階段在輸入文檔中的字段與“ joined”集合的文檔中的字段之間進行相等匹配。

在每個輸入文檔中,$ lookup階段都會添加一個新的數組字段,其元素是“ joined”集合中的匹配文檔。 $ lookup階段將這些經過重整的文檔傳遞到下一個階段。

有關更多詳細信息,請單擊$ lookup文檔。

暫無
暫無

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

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