在mongodb中查询关系集合的最佳方法?

时间:2017-07-03 17:57:04

标签: mongodb nosql

例如,我有2个集合:

第一个被命名为" Songs" ,此集合中的文档存储有关歌曲的所有元数据,如titleduration,{{1} } 和别的。除此之外,还有release_dateartist字段,这些字段存储来自" Stars"的关系文档的ID。集合。

"歌曲中的文档示例"系列:

producer

您猜测的第二个是&#34; Stars&#34; 此集合中的集合和文档存储了有关{ 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的明星歌曲。

最好和最快的方法是什么?
谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用以下聚合查询。

$match上的{p> release_date$regex上的title匹配。

$lookupartist上查找$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比较。