【问题标题】:Mongoose Inner Join猫鼬内连接
【发布时间】:2016-04-13 11:24:27
【问题描述】:

用户集合

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 does not support joins。使用两个查询的结果自己执行连接。
  • @Yazılım IO 查询这将非常复杂。您可能需要考虑以一种易于在 mongoDB 中查询的方式更改架构。
  • 好的,我可以更改,但我还必须更改集合组成吗?以及必须如何进行 Mongo 查询

标签: node.js mongodb mongoose


【解决方案1】:

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 这样的面向文档的数据库。

【讨论】:

    【解决方案2】:

    使用$lookup,对同一数据库中的未分片集合执行左外连接,以过滤来自“已连接”集合的文档进行处理。 $lookup 阶段在输入文档中的字段与“加入”集合的文档中的字段之间进行相等匹配。

    对于每个输入文档,$lookup 阶段添加一个新的数组字段,其元素是“加入”集合中的匹配文档。 $lookup 阶段将这些重新调整的文档传递到下一个阶段。

    更多详情请点击$lookup documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2021-10-25
      • 2020-06-10
      相关资源
      最近更新 更多