2015-06-13 2 views
1
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/"});Как найти все документы, имеющие одинаковые значения в двух полях с MongoDB?

но не получилось. пожалуйста, помогите`

+0

что у вас сделано до сих пор, пожалуйста, поделитесь ... – SSH

+0

Я изменил свой запрос тем, что я сделал до сих пор .. – mrana

ответ

2

Если я это хорошо понимаю, вам нужно найти все songs whose title contains the name of the artist. Вам не нужно регулярное выражение для этого . В качестве простого теста с использованием 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".


Используя регулярное выражение, здесь может быть даже вредным, если имя исполнителя содержит мета-символы или кванторов. Например, имя художника «You + Me», + здесь будет интерпретироваться как 1 или более появление предыдущего символа. Итак, соответствие «YouMe», «YouuuuuMe» , но не необработанная строка «You + Me».

1

Все, что находится внутри разделителей, считается «строкой», а не переменной. Кроме того, на «правой стороне это сравнение не действует. Так что вместо того, чтобы сделать

db.test.find({ "$where": " return new RegExp(this.artist,i).test(this.song_name);" }) 

Так RegExp() компилирует шаблон из переменной, тогда как // считает все содержащиеся в строковый литерал. Метод .test() как вы делаете сравнение содержания с регулярным выражением для «Boolean» результата.

Правда, что .indeOf() «должен» быть быстрее, чем регулярные выражения для основных строк, но если вам нужно без учета регистра сравнения затем .toLowerCase() или .toUpperCase() ввести другую стоимость их, поэтому отрицательная разница теряется.

Также я думаю, что это просто выглядит аккуратно.

Смежные вопросы