Given that new Documents and querys:
{
"_id" : ObjectId("55803fd1cc0c9aa090e608be"),
"song_name" : "Mickey is good",
"time" : "3.56",
"artist" : "Mickey"
}
{
"_id" : ObjectId("55803fd1cc0c9aa090e608bf"),
"song_name" : "Love is nothing",
"time" : "5.56",
"artist" : "Jimmy"
}
我需要查找哪些歌曲的标题与艺术家姓名相同。 我试过了: db.myCollection.find({$ where:“this.artist == /this.song_name/”});
但没有成功。请帮忙。
答案 0 :(得分:2)
如果我理解得很清楚,你需要找到所有songs whose title contains the name of the artist。您不需要 1 的正则表达式。使用indexOf
进行简单测试就足够了。给出您的样本数据:
> db.test.find({$where:
"this.song_name.toLowerCase().indexOf(this.artist.toLowerCase()) > -1"
})
{ "_id" : ObjectId("557ccec684ee2ba0375f4fcf"),
"song_name" : "Mickey is good",
"time" : "3.56",
"artist" : "Mickey" }
如果你真的需要找到标题等于的歌曲到艺术家名称(你的样本数据中没有这样的文件),你只需写下:
> db.test.find({$where:
"this.song_name.toLowerCase() == this.artist.toLowerCase()"
})
{ "_id" : ObjectId("557cd12284ee2ba0375f4fd1"),
"song_name" : "The Monkeys",
"artist" : "The Monkeys" }
请注意,在任何一种情况下,我都使用toLowerCase()
对字符串进行了规范化。根据您的使用情况,您可能需要比这更复杂的东西。例如,如果您需要匹配"You and Me" by "You+Me"。
1 如果艺术家名称包含元字符或量词,则在此处使用正则表达式甚至可能有害。例如,如果艺术家名称为“You + Me”,则此处的+
将被解释为前一个字符的1次或更多次出现。因此,匹配“YouMe”,“YouuuuuMe”但原始字符串“You + Me”。
答案 1 :(得分:1)
分隔符内的任何内容都被视为"字符串"而不是变量。同样在"右手侧,此比较无效。所以反而做
db.test.find({ "$where": " return new RegExp(this.artist,i).test(this.song_name);" })
所以RegExp()
编译变量中的模式,而//
认为所有包含在字符串文字中。 .test()
方法是如何使用正则表达式与内容进行比较的"布尔"结果
是的,.indeOf()
"应该"比基本字符串的正则表达式更快,但是如果你需要不区分大小写的比较,那么.toLowerCase()
或.toUpperCase()
会引入他们自己的另一个成本,因此可以忽略的差异。
我认为它看起来更整洁。