我需要使用文档引用关系(而不是嵌入式文档)进行聚合查询。我可以使用 mongo shell 进行该查询,但在使用 mongoose 进行等效实现时遇到了困难。
我已经尝试过虚拟填充方法,但这也返回了空数组。这是一些定义上下文的代码以及我的 mongo 查询。我在父文档和子文档之间存在一对多的关系。
//Parent Document
db.artists.insert(
{
_id : 4,
artistname : "Rush"
}
)
//Child Documents
db.musicians.insert(
{
_id : 9,
name : "Geddy Lee",
instrument : [ "Bass", "Vocals", "Keyboards" ],
artist_id : 4
}
)
db.musicians.insert(
{
_id : 10,
name : "Alex Lifeson",
instrument : [ "Guitar", "Backing Vocals" ],
artist_id : 4
}
)
db.musicians.insert(
{
_id : 11,
name : "Neil Peart",
instrument : "Drums",
artist_id : 4
}
)
//Query
db.artists.aggregate([
{
$lookup:
{
from: "musicians",
localField: "_id",
foreignField: "artist_id",
as: "band_members"
}
},
{ $match : { artistname : "Rush" } }
]).pretty()
//Result
{
"_id" : 4,
"artistname" : "Rush",
"band_members" : [
{
"_id" : 9,
"name" : "Geddy Lee",
"instrument" : [
"Bass",
"Vocals",
"Keyboards"
],
"artist_id" : 4
},
{
"_id" : 10,
"name" : "Alex Lifeson",
"instrument" : [
"Guitar",
"Backing Vocals"
],
"artist_id" : 4
},
{
"_id" : 11,
"name" : "Neil Peart",
"instrument" : "Drums",
"artist_id" : 4
}
]
}
//I've tried using populate, as well as aggregate. Here are both the implementations:
//Using populate
ArtistSchema.virtual('members', {
ref: 'MusicianCollection',
localField: '_id',
foreignField: 'artist_id',
justOne: false,
options: {limit: 5}
})
this.ArtistModel.findById(id).populate('members').exec((err, data) => {
if (err) console.log(err)
else artist = data
})
//in this i get a features array, but its empty
//Using aggregate
let artist = await this.ArtistModel.aggregate([
{ $match: { _id: id} },
{ $lookup: {
from: 'Musicians',
localField: '_id',
foreignField: 'artist_id',
as: 'members'
} }
]);
//in this the request times out