Mongoose表与表之间实现关联查询

建两个表:userfriend,实现friend关联user

关联
  • user.js

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    // 建立用户表
    const UserSchema = new Schema({
        name:{                      // 用户名
            type: String,
        },
    });
    
    module.exports = User = mongoose.model('user', UserSchema);
    
  • friend.js

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    // 建立好友表
    const FriendSchema = new Schema({
        friendId:{                   // 好友id
            type: mongoose.Schema.Types.ObjectId,
            ref: 'user'
        },
        state:{                     // 状态
            type: String,
        }
    });
    
    module.exports = FriendLists = mongoose.model('friendLists', FriendSchema);
    

注意

  • ref绑定的是表在数据库中的名字,并不是nodejs中对外暴露的表名,所以friend.js中,ref:'user'而不是ref:'User'
  • 如果两个表是在同一个.js文件中创建的,那么typetype: Schema.Types.ObjectId,不需要加上mongoose
关联查询
  • friendSever.js

    const Friend = require('./friendLists');
    // 获取好友列表
    module.exports.getUsers = function(data, res){
        let query = Friend.find({});
        // 查询条件
        query.where({'state': data.state});
        // 查找friendId关联的 user
        query.populate('friendId');
        // 根据最后通讯时间对查找结果进行排序
        query.sort({'lastTime':-1});
        // 输出查询结果
        query.exec().then(e => {
            let result = e.map(function(ver){
                return {
                    id: ver.friendId._id,
                    name: ver.friendId.name
                }
            });
            res.json({
                status: 200,
                result: result,
                message: '查询成功'
            })
        }).catch(err => {
            res.json({
                status: 500,
                message: '查询失败',
                error: err
            })
        })
    }
    

你可能感兴趣的:(MongoDB,node.js,mongodb)