如何使用MongoDB查找两个字段中具有相同值的所有文档?

时间:2015-06-13 23:10:50

标签: regex mongodb mongodb-query

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/”});

但没有成功。请帮忙。

2 个答案:

答案 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()会引入他们自己的另一个成本,因此可以忽略的差异。

我认为它看起来更整洁。