如何使用Mongoose从MongoDB中的两个集合关系中查找计数

时间:2016-10-07 15:35:38

标签: node.js mongodb mongoose mongoose-schema

我想显示特定用户的列表文件(_id:876896),其点击次数如下:

Sr. No. | File Name | Click Count

以下是我正在使用的示例架构:

var clicks = mongoose.Schema({
 file_id   : String,
 IP    : String
});

var files = mongoose.Schema({
 filename   : String,
 owner    : {type:mongoose.Schema.ObjectId, ref:'users'},
});

这样做有多有效。

1 个答案:

答案 0 :(得分:3)

您可以分两步完成,首先获取所有引用您想要数据的用户的文件。然后,获取与您阅读的文件相关的所有点击次数。 mongodb中没有INNER_JOIN

小例子

     files.find({
           owner: {
              $in: usersIdsArray // [_id, _id...] ids of all users
           },
        }).then((ret = []) => {
            // Here ret is array of files
            if (!ret.length) // There is no files matching the user
            return clicks.find({
                 file_id: {
                     $in: Array.from(ret, x => x._id.toString()),
                     // build an array like [_id, _id, _id...]
                 },
            });
        }).then((ret = []) => {
            // Here you have all clicks items
        });

我还建议使用嵌入式架构而不是多个集合:

var clicks = mongoose.Schema({
 file_id: String,
 IP: String
});

var files = mongoose.Schema({
 filename: String,
 owner: {type:mongoose.Schema.ObjectId, ref:'users'},
});

变成:

var files = mongoose.Schema({
   filename: String,
   owner: {type:mongoose.Schema.ObjectId, ref:'users'},
   clicks: [String], // With String your IP
});

MongoDB在大数据方面表现良好,但在关系方面却不是很好。