我正在尝试使用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);
}
});
但是问题是,我总是在成员字段中得到一个空数组。
我尝试将每个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);
}
});
答案 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);
}
});