Выполнить поиск без учета регистра для массива в MongoDB? - PullRequest
2 голосов
/ 21 мая 2010

Итак, я решил промочить ноги с MongoDB и до сих пор люблю это. Это кажется очень быстрым и гибким, и это здорово. Но я все еще прохожу начальную кривую обучения и поэтому часами копаю информацию о самых основных вещах.

Я искал всю документацию MongoDB в Интернете и часами гулял по страницам, не упоминая об этом. Я знаю, что Mongo все еще довольно новый (v1.x), поэтому он объясняет, почему еще не так много информации. Я даже пытался искать книги по Монго без особой удачи. Так что да, я попробовал RTM без удачи, так что теперь я перехожу к вам.

У меня есть массив различных хэштегов, вложенных в каждый документ (например: #apples, #oranges, #Apples, #APPLES), и я хотел бы выполнить find () без учета регистра, чтобы получить доступ ко всем документам, содержащим яблоки в любой случай. Кажется, что find поддерживает некоторые регулярные выражения с / i, но я не могу заставить это работать.

Во всяком случае, я надеюсь, что это быстрый ответ для кого-то.

Вот мой существующий вызов в PHP с учетом регистра:

$cursor = $collection->find(array( "hashtags" => array("#".$keyword)))->sort(array('$natural' => -1))->limit(10);

Помощь

Ответы [ 2 ]

0 голосов
/ 27 октября 2014

Вот пример для нечувствительного к регистру поиска в mongodb с php

$search_string='baR';

$searchQuery = array(
            '$or' => array(
                array(
                    'field1' => new MongoRegex("/^$search_string/i"),
                    ),
                array(
                    'field2' => new MongoRegex("/^$search_string/i"),
                    ),
                )
            );

$cursor = $customers->find($searchQuery);

надеется, что это поможет любому.

0 голосов
/ 18 ноября 2010

Я подозреваю, что ваш запрос не возвращает то, что вы действительно хотите ...

Если вы делаете

db.col.find( { some_array_field: ["item1", "item2"] } );

тогда будет только совпадать с документами, в которых ТОЛЬКО эти два элемента находятся в поле some_array_field. Поэтому, если есть документ с хэштегами [item1, item2], он будет соответствовать, но документ с тегами [item1, item2, item3] не будет совпадать.

Вы можете использовать аргумент $ all, как описано в этом посте:

Как выполнить запрос AND для массива в mongodb?

, например * * 1016

db.col.find( { some_array_field: { $all : ["item1", "item2"] } } );

или

db.col.find( { some_array_field: "item1", some_array_field: "item2" } );

Это различие между полным совпадением документов и частичным совпадением в MongoDB меня сначала смутило.

...