Точное Содержит Матч на Подколлекции - PullRequest
0 голосов
/ 07 декабря 2010

Используя mongodb с драйвером NoRM, у меня есть этот документ:

{
    "_id" : ObjectId("0758030341b870c019591900"),
    "TmsId" : "EP000015560091",
    "RootId" : "1094362",
    "ConnectorId" : "SH000015560000",
    "SeasonId" : "7894681",
    "SeriesId" : "184298",
    "Titles" : [
            {
                    "Size" : 120,
                    "Type" : "full",
                    "Lang" : "en",
                    "Description" : "House"
            },
            {
                    "Size" : 10,
                    "Type" : "red",
                    "Lang" : "en",
                    "Description" : "House M.D."
            }
    ], yadda yadda yadda

, и я запрашиваю как:

var query = new Expando();
query["Titles.Description"] = Q.In(showNames);
var fuzzyMatches = db.GetCollection<Program>("program").Find(query).ToList();

, где showNames - строка [] содержит что-то вроде {"House "," Glee "," 30 Rock "}

Мои результаты содержат нечеткие совпадения.Например, термин «Дом» возвращает каждое шоу с заголовком со словом «Дом» (как, например, «Содержит»).

То, что я хотел бы, это прямые совпадения.Поэтому, если document.Titles содержит «Большой синий дом», он не возвращает совпадение.Только если Titles.Description содержит "House", я бы хотел совпадение.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Мне не удалось воспроизвести проблему, возможно, из-за того, что мы используем разные версии MongoDB и / или NoRM. Однако вот некоторые шаги, которые могут помочь вам найти источник нечетких результатов.

  1. Включите профилирование с помощью оболочки MongoDB:

    > db.setProfilingLevel(2)
    
  2. Запустите ваш код еще раз.
  3. Установить уровень профилирования обратно на 0.
  4. Просмотр выполненных запросов:

    > db.system.profile.find()
    

Информация о профилировании должна выглядеть примерно так:

{
  "ts" : "Wed Dec 08 2010 09:13:13 GMT+0100",
  "info" : "query test.program ntoreturn:2147483647 reslen:175 nscanned:3  \nquery: { query: { Titles.Description: { $in: [ \"House\", \"Glee\", \"30 Rock\" ] } } }  nreturned:1 bytes:159",
  "millis" : 0
}

Фактический запрос находится в свойстве info и должен быть:

{ Titles.Description: { $in: [ "House", "Glee", "30 Rock" ] } }

Если ваш запрос выглядит иначе, то проблема в драйвере NoRM. Например, если NoRM преобразует ваш код в следующий запрос регулярного выражения, он выполнит сопоставление подстроки:

{ Titles.Description: { $in: [ /House/, /Glee/, /30 Rock/ ] } }

Я сам использовал NoRM, но я не сталкивался с настройкой, чтобы контролировать это. Возможно, вы используете другую версию, которая поставляется с такой функциональностью.

Если ваш запрос не отличается от того, каким он должен быть, попробуйте запустить запрос из оболочки. Если это все еще дает нечеткие результаты, то мы определенно используем разные версии MongoDB;)

1 голос
/ 08 декабря 2010

в синтаксисе оболочки:

db.mycollection.find ({"Titles.Description": "House"})

...