mongodb - 从标题中提取年份

时间:2016-12-28 22:49:54

标签: mongodb

我是 Mongodb 的初学者。 我正在使用MoviesLens数据集。

我的收藏品有一个字段'Title' = 'Toy Story (1995)'

我想获得以下内容:

'Title' = 'Toy Story'
'Year' = '1995'

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

请记住,在Mongo中,您可以使用相当宽的Javascript标准库子集。关键是Array#map。比如,你的收藏被称为“电影”。在Mongo CLI中,您可以这样查询:

db.collection('movies').find();

此处,find会返回cursor。这个游标支持一堆方法,map就是其中之一。 Map将函数作为第一个参数,此函数将应用于游标的每个项目(实际上,它是very common functional pattern)。所以,如果你这样做:

db.collection('movies').find().map(item => item);

然后你会得到一个元素集合,因为

item => item

是一个应用了一个项目的函数,它返回项目而不更改它。

现在,您拥有item的Title属性,该值是一个包含电影和年份名称的字符串,用圆括号括起来。要解构字符串,通常使用regular expressions

你可以看到一个字符串“玩具总动员(1995)”有一个可能的模式:“%MOVIE%(%YEAR%)”,其中%MOVIE%是一系列字母,数字和可能的其他字符(破折号,等)%YEAR%必须由数字组成。适当的正则表达式将是

/^(.+)\s\((\d{4})\)$/

你接下来要做的是在map中应用这样一个函数,它接受项目并做两件事:

  1. 将“标题”属性的值替换为标题和
  2. 添加具有适当值的“Year”属性。
  3. 应该是这样的:

    db.collection('movies').find().map(item => Object.assign({}, item, {
      Title: /^(.+)\s\((\d{4})\)$/.match(item.Title)[1],
      Year: /^(.+)\s\((\d{4})\)$/.match(item.Title)[2]
    }));
    

    请注意,调用cursor.map不会更新集合中的项目。要更新它们,请使用db.collection.update