【问题标题】:Best way to query relational collections in mongodb?在 mongodb 中查询关系集合的最佳方法?
【发布时间】:2017-12-07 01:49:34
【问题描述】:

例如,我有 2 个集合:

第一个名为“歌曲”,此集合中的文档存储有关歌曲的所有元数据,例如titledurationrelease_date 等。除此之外,还有artistproducer 字段,这些字段存储来自“Stars”集合的关系文档的id。

“歌曲”集合中的文档示例:

{ 
   id: SONG_ID
   title: TITLE, 
   duration: DURATION, 
   release_date: ISO_DATE,
   ...
   artist: STAR_ID
   producer: STAR_ID
} 

您猜的第二个是“Stars”集合,该集合中的文档存储有关fullnamedate_of_birth等明星的信息。

“星星”集合中的文档示例:

{ 
   id: STAR_ID
   fullname: FULLNAME, 
   date_of_birth: DATE_OF_BIRTH
   ...
} 

假设我想找到(1 个条件)标题中有“爱”字的歌曲,(2 个条件)在 2017 年发行的歌曲和(3 个条件)来自 Rihanna 或 Zara Larsson 等艺术家的歌曲。请注意,我的问题与简单的左外连接不同。请注意,在此查询中,第 3 个条件与存储在第二个集合“Stars”中的信息有关,所以我不想只用“Stars”集合中的信息污染艺术家和制作人字段,而且我想选择像 Rihanna 或 Zara 这样的明星歌曲拉尔森。

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

【问题讨论】:

  • @AdamHarrison 请注意,我的问题与简单的左外连接不同。请注意,在此查询中,第 3 个条件与存储在第二个集合“Stars”中的信息有关,所以我不想只用“Stars”集合中的信息污染艺术家和制作人字段,而且我想选择像 Rihanna 或 Zara 这样的明星歌曲拉尔森。
  • 您是否正在寻找您遇到问题的特定实施部分?很难知道你做了什么,你期待什么样的答案。
  • @Veeram 我愿意接受任何可以解释我如何以最佳方式为这种情况构建查询的答案。

标签: mongodb nosql


【解决方案1】:

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

release_date 上的$match$regex 匹配title

$lookup 查找 artist 集合,然后在 fullname 上查找 $match 以获取输入值。

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比较。

【讨论】:

  • 谢谢!我认为聚合管道和 $match 运算符正是我想要的。但据我所知,第二个 $match 将无法利用索引,这是令人失望的一点。
  • 不客气。第二个匹配可以使用索引。在$lookup$match之间加上$unwind,看看能不能使用index。更多这里jira.mongodb.org/browse/SERVER-28140
  • 在这种特定情况下,我认为更好的解决方案是分两步完成。在第一步中,从 Stars 集合中按名称查找星星的 ID。然后在第二步中使用第一步中的 id 找到所需的歌曲。您如何看待这个解决方案?
  • 只有一种方法可以找出为您的应用程序测试这两种方法的方法。
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多