【发布时间】:2019-10-30 21:18:18
【问题描述】:
我需要使用文档引用关系(而不是嵌入文档)进行聚合查询。我可以使用 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
【问题讨论】:
-
请说明你用
mongoose做了什么? -
@RaviShankarBharti 我已经更新了代码 sn-p。请看一看。
-
Amazon DocumentDB 现在支持 $lookup:aws.amazon.com/about-aws/whats-new/2019/10/…
标签: mongodb mongoose mongoose-populate aws-documentdb-mongoapi aws-documentdb