[英]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這樣的查詢語言。 因此,您應該更改數據庫架構。
這是一個例子:
定義您的架構。 您無法像在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.