我试图使用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);
}
});
但问题是,我总是得到成员字段的空数组。
我想把每个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);
}
});
我找到了解决方案,事实上,我使用的是 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);
}
});