猫鼬填充两个简单的模式
Posted
技术标签:
【中文标题】猫鼬填充两个简单的模式【英文标题】:mongoose populate two simple schemas 【发布时间】:2018-12-15 10:52:34 【问题描述】:我坚持使用猫鼬populate()
方法。
这是我的架构:
const GroupSchema = Schema(
title: String,
ips: [
ip: String,
hostname: String,
added : type : Date, default: Date.now
]
);
module.exports = mongoose.model('groups', GroupSchema);
const UserSchema = Schema(
username: String,
ip: String,
groups: [
_id : type: Schema.Types.ObjectId, ref: 'groups',
added : type : Date, default: Date.now
]
);
module.exports = mongoose.model('users', UserSchema);
我正在尝试通过groups._id
加入users.groups[]._id
,但绝对没有运气。
这是我的尝试:
User.find().
populate('groups').
exec(function (err, user)
if (err) return handleError(err);
console.log(user);
);
得到这个结果:
_id: 5b3e039a2f714d38ccf66cax,
username: 'rrrr',
ip: '10.1.1.1',
groups: [ [Object], [Object] ],
__v: 0 ]
我想变成这样:
_id: 5b3e039a2f714d38ccf66cax,
username: 'rrrr',
ip: '10.1.1.1',
groups: [ title: sssss, added: ssss , title: xxxx, added: ssss] ],
__v: 0 ]
【问题讨论】:
您正在获取groups: [ [Object], [Object] ]
中的数据...尝试使用user[0].groups
或user[0].groups[0]
进行控制台
不工作。我得到了这个: GET /users 304 10.850 ms - - 添加:2018-07-07T16:14:41.689Z,_id: 5b3de77deea8fa128428421d
从您的控制台 _id: 5b3e039a2f714d38ccf66cax, username: 'rrrr', ip: '10.1.1.1', groups: [ [Object], [Object] ], __v: 0 ]
看来您正在获取组...有什么问题?
例如 user[0] 有两个组但未填充:User.find()。填充(“组”)。 exec(function (err, user) if (err) return handleError(err); console.log(user[0].username); console.log(user[0].groups[0].hostname); 控制台。日志(用户[0].组[1].主机名););我得到'未定义'
好的,谢谢,我会尝试找出如何使用查找
【参考方案1】:
你可以尝试使用$lookup
聚合
如果您使用的是 3.4 及以下版本的 mongodb
User.aggregate([
"$unwind": "$groups" ,
"$lookup":
"from": Groups.collection.name,
"let": "groupId": "$groups._id" ,
"pipeline": [
"$match": "$expr": "$eq": [ "$_id", "$$groupId" ]
],
"as": "groups._id"
,
"$unwind": "$groups._id" ,
"$group":
"_id": "$_id",
"username": "$first": "$username" ,
"ip": "$first": "$ip" ,
"groups": "$push": "$groups"
])
如果您使用的是 3.6 及以上版本的 mongodb
User.aggregate([
"$unwind": "$groups" ,
"$lookup":
"from": Groups.collection.name,
"localField": "groups._id",
"foreignField": "_id",
"as": "groups._id"
,
"$unwind": "$groups._id" ,
"$group":
"_id": "$_id",
"username": "$first": "$username" ,
"ip": "$first": "$ip" ,
"groups": "$push": "$groups"
])
【讨论】:
以上是关于猫鼬填充两个简单的模式的主要内容,如果未能解决你的问题,请参考以下文章