基本上,你可以替換子查詢的聯接。雖然MongoDB的不「支持」連接,它支持的東西,是類似於子查詢,纔沒有發生災難性的破壞結果的模式(僞代碼):
users = db.users.find({criteria});
posts = db.posts.find({authorId : { $in : users.select(p -> p.id) } });
這將找到匹配criteria
所有用戶和他們的所有帖子通過$in
。與SQL不同,結果(映射到不同的類)不會被抹掉在單個結果blob中,而是獲得用戶列表,並通過不同的請求獲取他們的帖子。另一方面,您可能必須將用戶存儲在字典中,並將它們映射到帖子以在應用程序代碼中構建完全填充的域模型。
然而,理解您應該儘量避免使用NoSQL時那樣的查詢是至關重要的。儘可能使信息非規範化。例如,而不是隻在一個帖子中存儲authorId
,而是存儲authorName
。這使得顯示帖子列表更容易和更快,但是代價是必須將更改與作者姓名同步。在其他情況下,甚至可以嵌入信息。例如,tags
可能是簡單的字符串列表,即
post { title:"foo", tags:["correct", "battery", "staple", "horse"] }
您也可以使用$in
進行刪除,例如db.collection.remove({"_id" : {$in : [ id1, id2, ... ] } });
也可以用連接刪除嗎? – jamesb