-3

如何在 mongodb 中加入 2 个集合?

我有一个参考FK_ID领域。collection2collection1

在我以前做的 SQL 中

SELECT * FROM collection1 c1 JOIN collection2 c2 on c2.FK_ID = c1.ID

这行得通吗?

db.collection1.join(collection2, {collection1.ID:collection2.FK_ID})

或围绕这些线的东西?谢谢

4

2 回答 2

1

不,它不起作用。MongoDB不支持连接,一次只能查询一个集合。你需要从某种NoSQL方式开始思考,换句话说,考虑使用embedded documents,如果你不能,那么你可以使用DB References来参考文档。想想 NoSQL。

附注:您无法猜测语法,请阅读文档以了解支持哪些操作,MongoDB文档非常全面

于 2014-02-05T15:38:22.993 回答
0

基本上,您可以用子选择替换 JOIN。虽然 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, ... ] } });

于 2014-02-05T15:45:33.173 回答