猫鼬$ lookup问题

时间:2020-05-02 22:50:13

标签: mongodb mongoose lookup

我正在尝试使用mongoDb的$ lookup。我在React应用程序中使用猫鼬。

这是我的小组模型文件

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const GroupSchema = new Schema({
        users: {type: Array}, //["id",..]
        name: {type: String},
        pending: {type: Array}
});

const Group = mongoose.model('Group',GroupSchema);
module.exports = Group;

这是我的用户模型文件

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const UserSchema = new Schema({
    name: {type: String},
    email: {type: String, unique: true},
});

const User = mongoose.model('User',UserSchema);
module.exports = User;

这是一个组的示例:

{   "users": [],
    "admin": [
      "5eac9981c6a12c190814ec2d"
    ],
    "pending": [
      "5ead65e3cb971e31a4d1c538"
    ],
    "_id": "5ead578c145003326cbceda6",
    "name": "Group 1",
    "__v": 0 }

以下是一个用户示例:

  {
    "_id": "5ead65e3cb971e31a4d1c538",
    "name": "Patate",
    "email": "patate@orange.fr",
    "__v": 0
  }

所有示例都直接从我的数据库中提取,我试图获取与包含在组文档中待定数组中的userId相对应的user元素。

const Group = require('../models/Group.model');
const Users = require('../models/User.model');
Group.aggregate(
    [{$lookup:
        {
            from: Users.collection.name,
            localField: "pending",
            foreignField : "_id",
            as: "members"
        }},
        {$project: {members:1,pending:1 }}]
    )
    .exec((err, result)=>{
    if (err) {
        res.status(500).json(err);
    }
    if (result) {
        res.status(200).json(result);
    }
    });

但是问题是,我总是在成员字段中得到一个空数组。

编辑1

我尝试将每个String转换为ObjectId,但是输出为空:mongoplayground 问题似乎与使用猫鼬有关,因为使用此query在mongoplayground中有效,但在像这样的猫鼬中无效:

Group.aggregate([
    {
        $lookup: {
            from: "Users",
            localField: "pending",
            foreignField: "_id",
            as: "members"
        }
    }
])
    .exec((err, result)=>{
    if (err) {
        res.status(500).json(err);
    }
    if (result) {
        res.status(200).json(result);
    }
    });

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,实际上,我正在使用https://cloud.mongodb.com/,并且在集合内部进行搜索时,发现集合的名称与我使用的名称不同。 最后,集合的名称是“用户”,而不是我放入用户模型文件中的“用户”。

我使用的最终代码是:

const Group = require('../models/Group.model');
const User = require('../models/User.model');
Group.aggregate([
        {
            $project: {
                pending: {
                    $map: {
                        input: "$pending",
                        as: "item",
                        in: {
                            $toObjectId: "$$item"
                        }
                    }
                }
            }
        },
        {
            '$lookup': {
                'from': "users",
                'localField': "pending",
                'foreignField': "_id",
                'as': "members"
            }
        }
    ])
    .exec((err, result)=>{
    if (err) {
       res.status(500).json(err);
    }
    if (result) {
       res.status(200).json(result);
    }
    });