例如,我有2个集合:
第一个被命名为" Songs" ,此集合中的文档存储有关歌曲的所有元数据,如title
,duration
,{{1} } 和别的。除此之外,还有release_date
和artist
字段,这些字段存储来自" Stars"的关系文档的ID。集合。
"歌曲中的文档示例"系列:
producer
您猜测的第二个是" Stars" 此集合中的集合和文档存储了有关{
id: SONG_ID
title: TITLE,
duration: DURATION,
release_date: ISO_DATE,
...
artist: STAR_ID
producer: STAR_ID
}
,fullname
等星标的信息。< / p>
&#34; Stars&#34;中的文档示例系列:
date_of_birth
假设我想找到(1个条件)有爱的歌曲&#34;他们的头衔,(2条件)在2017年发布,(3条件)来自Rihanna或Zara Larsson等艺术家。请注意,我的问题与简单的左外连接不同。请注意,在此查询中,第三个条件涉及存储在第二个集合中的信息&#34; Stars&#34;,所以我不希望只有污染的艺术家和制作人字段来自&#34; Stars&#34;收藏,但我也想选择喜欢Rihanna或Zara Larsson的明星歌曲。
最好和最快的方法是什么?
谢谢你的帮助!
答案 0 :(得分:0)
您可以使用以下聚合查询。
$match
上的{p> release_date
和$regex
上的title
匹配。
$lookup
在artist
上查找$match
集合后跟fullname
输入值。
db.Songs.aggregate([
{ "$match":{ "release_date": { "$gte": ISODate("2017-01-01T00:00:00.000Z"), "$lt": ISODate("2018-01-01T00:00:00.000Z")}, title: { $regex: /love$/ } } },
{ "$lookup": {
"from" : "Stars",
"localField" : "artist",
"foreignField" : "_id",
"as" : "star"
}
},
{ "$match" : { "star.fullname" : { "$in": [ "Rihanna", "Zara Larsson" ] } } }
])
正则表达式可以在anchored时使用索引。与text search比较。