Mongoose $lookup问题

问题描述 投票:0回答:1

我试图使用mongoDb的$lookup。我在一个React应用程序中使用mongoose。

下面是我的组模型文件

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 }

下面是一个User的例子。

  {
    "_id": "5ead65e3cb971e31a4d1c538",
    "name": "Patate",
    "email": "[email protected]",
    "__v": 0
  }

所有的例子都是直接从我的数据库中提取出来的,我试图在群组文档中的待定数组中获取与userId对应的用户元素。

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这个问题似乎与使用mongoose有关,因为使用这个 疑问 在mongoplayground工作,但不能使用mongoose这样的工作。

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);
    }
    });
mongodb mongoose lookup
1个回答
0
投票

我找到了解决方案,事实上,我使用的是 https:/cloud.mongodb.com。在集合中搜索,发现集合的名字和我使用的不一样,集合的两端是 "用户",而不是我放在用户模型文件中的 "用户"。

我最后使用的代码是.NET Framework 2.0。

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);
    }
    });
© www.soinside.com 2019 - 2024. All rights reserved.