mongoose内连接

用户集合

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不支持这个请求。 但是,这是更好的解决scheme? 任何机构都可以为我写一个例子吗?

MongoDB是面向文档的,而不是关系数据库。 所以它没有像SQL这样的查询语言。 所以你应该改变你的数据库模式。

这里是一个例子:

  1. 定义你的模式。 你不能像在sql数据库中一样保存mongodb中的关系。 所以把朋友直接添加到用户。 为这些关系添加属性,你必须创build一个新的模型(这里: 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 )或graphics数据库(如Neo4j ),而不是像MongoDB这样的面向文档的数据库。

使用$lookup ,在同一个数据库中执行一个左外部联接到一个未加注的集合,以过滤“已join”集合中的文档进行处理。 $ lookup阶段在来自input文档的字段和来自“已join”集合的文档的字段之间进行平等匹配。

对于每个input文档,$ lookup阶段添加一个新的数组字段,其元素是来自“joined”集合的匹配文档。 $ lookup阶段将这些重新构build的文档传递到下一个阶段。

有关更多详细信息,请单击$ lookup文档