Как найти средний возраст пользователей, поиск по слову в поле MongoDB? [Дубликат]

Вы также можете использовать Bridge.net. Начиная с версии 1.7, он поддерживает создание определений типа Type для типов C #. См. http://bridge.net/docs/generate-typescript-definitions/

1070
задан shA.t 14 January 2017 в 05:06
поделиться

30 ответов

Это должно быть:

db.users.find({"name": /.*m.*/})

или, похоже:

db.users.find({"name": /m/})

Вы ищете что-то, что содержит «m» где-нибудь (SQL '% 'эквивалентен Regexp's' .* '), а не то, что имеет «m», привязанное к началу строки.

1442
ответ дан shA.t 19 August 2018 в 17:16
поделиться
  • 1
    поиск по regex дорого? – Freewind 22 July 2010 в 11:13
  • 2
    На самом деле это зависит. Если запрос не использует индекс и должен выполнять сканирование таблицы, то это, безусловно, может быть дорогостоящим. Если вы выполняете запрос «начинается с», то он может использовать индекс. Лучше всего запустить объяснение (), чтобы узнать, что происходит. – Kyle Banker 22 July 2010 в 15:49
  • 3
    Когда он не привязан к началу строки, это несколько дорого. Но опять же, так же как и запрос LIKE в SQL. – Emily 26 July 2010 в 19:50
  • 4
    так что пока он привязан к началу строки, все в порядке? тогда прохладно. означает ли это, что нам нужно добавить ^ – J. Chang 31 August 2012 в 04:55
  • 5
    Я бы добавил regex i javascript db.users.find({ "name": { $regex: /m/i } }) – Doron Segal 19 June 2015 в 03:24

Используйте регулярные выражения, как показано ниже. «I» показывает нечувствительность к регистру.

var collections = mongoDatabase.GetCollection("Abcd");

var queryA = Query.And(
         Query.Matches("strName", new BsonRegularExpression("ABCD", "i")), 
         Query.Matches("strVal", new BsonRegularExpression("4121", "i")));

var queryB = Query.Or(
       Query.Matches("strName", new BsonRegularExpression("ABCD","i")),
       Query.Matches("strVal", new BsonRegularExpression("33156", "i")));

var getA = collections.Find(queryA);
var getB = collections.Find(queryB);
6
ответ дан Abhijit Bashetti 19 August 2018 в 17:16
поделиться

MongoRegex устарел. Использовать MongoDB \ BSON\regex

$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor
1
ответ дан Albert s 19 August 2018 в 17:16
поделиться
  • 1
    Важно отметить, что это относится к классу MongoRegex в PHP . Не очень уместен этот вопрос, связанный с узлом. Вероятно, это должен быть комментарий или еще лучше - ответ на вопрос в отдельном сообщении. – Boaz 8 February 2018 в 15:31

Для Mongoose в Node.js

db.users.find({'name': {'$regex': '.*sometext.*'}})
11
ответ дан Aqib Mumtaz 19 August 2018 в 17:16
поделиться

Если вы используете PHP, вы можете использовать обертку MongoDB_DataObject , как показано ниже:

$model = new MongoDB_DataObject();

$model->query("select * from users where name like '%m%'");

while($model->fetch()) {
    var_dump($model);
}

ИЛИ:

$model = new MongoDB_DataObject('users);

$model->whereAdd("name like '%m%'");

$model->find();

while($model->fetch()) {
    var_dump($model);
}
1
ответ дан CEDA 19 August 2018 в 17:16
поделиться

Вы можете использовать новую функцию 2.6 mongodb:

db.foo.insert({desc: "This is a string with text"});
db.foo.insert({desc:"This is a another string with Text"});
db.foo.ensureIndex({"desc":"text"});
db.foo.find({
    $text:{
        $search:"text"
    }
});
10
ответ дан cmarrero01 19 August 2018 в 17:16
поделиться
  • 1
    Примечание. Текстовый поиск AFAIK Mongodb работает только по целому слову, поэтому он будет соответствовать значениям типа «Это строка с текстом», но не «Это строка с подтекстом». Так что это не совсем похоже на sql's "LIKE & quot; оператор. – rocketmonkeys 10 March 2015 в 19:34
  • 2
    @Rocketmonkeys его истинно .. для чего-то вроде оператора LIKE & quot; вы должны использовать оператор $ regex mongo. – cmarrero01 10 March 2015 в 22:46

Кажется, что есть причины использовать как шаблон javascript /regex_pattern/, так и шаблон mongo {'$regex': 'regex_pattern'}. См. Также: Ограничения синтаксиса RegGrange MongoBD

Это не полный учебник RegEx, но я был вдохновлен на запуск этих тестов после просмотра сильно проголосовавшего неоднозначного сообщения выше .

> ['abbbb','bbabb','bbbba'].forEach(function(v){db.test_collection.insert({val: v})})

> db.test_collection.find({val: /a/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.*a.*/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.+a.+/})
{ "val" : "bbabb" }

> db.test_collection.find({val: /^a/})
{ "val" : "abbbb" }

> db.test_collection.find({val: /a$/})
{ "val" : "bbbba" }

> db.test_collection.find({val: {'$regex': 'a$'}})
{ "val" : "bbbba" }
9
ответ дан Community 19 August 2018 в 17:16
поделиться
  • 1
    В соответствии с предыдущими ответами и комментариями поиск в формате $ text (Index) дает лучшее решение с эталонным сравнением по правилу $ regex. Для справки проверьте эту ссылку stackoverflow.com/questions/10610131/… . Можно ли реализовать метод $ text index с PHP и mongoDB – sankar muniyappa 2 April 2016 в 12:55

Вы можете использовать инструкцию where для построения любого скрипта JS:

db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );

Ссылка: http://docs.mongodb.org/manual/reference/operator/where/

6
ответ дан Crasher 19 August 2018 в 17:16
поделиться
  • 1
    $where крайне неэффективен. Сделайте полную проверку коллекции :( – Sushant Gupta 23 September 2013 в 16:23
  • 2
    Признаюсь, я еще не проводил никаких тестов производительности. – Crasher 23 September 2013 в 20:11
  • 3
    ах, не проблема, я так говорил: D – Sushant Gupta 23 September 2013 в 20:31

С MongoDB Compass вам нужно использовать синтаксис строгого режима, как таковой:

{ "text": { "$regex": "^Foo.*", "$options": "i" } }

(В MongoDB Compass важно, чтобы вы использовали " вместо ')

4
ответ дан damd 19 August 2018 в 17:16
поделиться

Если вы используете node.js, он говорит, что вы можете написать это:

db.collection.find( { field: /acme.*corp/i } );
//or
db.collection.find( { field: { $regex: 'acme.*corp', $options: 'i' } } );

Также вы можете записать это:

db.collection.find( { field: new RegExp('acme.*corp', 'i') } );
26
ответ дан Eddy 19 August 2018 в 17:16
поделиться
  • 1
    Аналогичный синтаксис в Ruby: collection.where(field => Regexp.new(value)) – Donny Kurnia 16 April 2014 в 00:45

Если вы хотите, чтобы поиск «Like» в mongo, вы должны пойти с $ regex, используя этот запрос, будет

db.product.find({name:{$regex:/m/i}})

, поскольку вы можете прочитать документацию как Что ж. https://docs.mongodb.com/manual/reference/operator/query/regex/

3
ответ дан jarry jafery 19 August 2018 в 17:16
поделиться

Вы использовали бы регулярное выражение для этого в mongo.

например: db.users.find({"name": /^m/})

43
ответ дан Joshua Partogi 19 August 2018 в 17:16
поделиться
  • 1
    Я думаю, что это только показывает документы с именем, которое начинается с «m». – JackAce 17 July 2014 в 01:23

В

  • PyMongo с использованием Python
  • Mongoose с использованием Node.js
  • Jongo, используя Java
  • mgo, используя Go

вы можете сделать:

db.users.find({'name': {'$regex': 'sometext'}})
191
ответ дан Kirill Gusyatin 19 August 2018 в 17:16
поделиться
  • 1
    он отлично работает для поиска с учетом регистра, не могли бы вы рассказать мне, как я могу заставить его работать, чтобы выполнить регистр без учета регистра? – Tahir Yasin 29 March 2017 в 15:41
  • 2
    Каким будет регулярное выражение для %sometext% – Tahir Yasin 30 March 2017 в 07:18
  • 3
    @TahirYasin, если вам все еще интересно, поиск без учета регистра будет выполнен следующим образом: db.users.find({'name': {'$regex': 'sometext', '$options': 'i'}}) – sumowrestler 14 July 2017 в 00:09
  • 4
    Я решил в golang использовать mgo просто код, подобный этому, selector: = bson.M {"technician": bson.M {"$ regex": tech}} – Sandun Priyanka 12 March 2018 в 20:07
  • 5
    @SandunPriyanka, библиотека mgo имеет встроенный тип регулярного выражения, вы должны использовать bson.M{"technician", bson.RegEx{Pattern: tech}} вместо этого (но убедитесь, что tech был дезинфицирован или у вас есть уязвимость в отношении регулярного выражения!) – kbolino 20 March 2018 в 22:02

Использовать поиск подстроки агрегирования (с индексом !!!):

db.collection.aggregate([{
        $project : {
            fieldExists : {
                $indexOfBytes : ['$field', 'string']
            }
        }
    }, {
        $match : {
            fieldExists : {
                $gt : -1
            }
        }
    }, {
        $limit : 5
    }
]);
1
ответ дан kz_sergey 19 August 2018 в 17:16
поделиться
  • 1
    хороший! есть ли способ, чтобы весь документ был согласован? или сделать структуру агрегации сделать последующий запрос для этого? На данный момент матч выглядит так: { "_id" : ObjectId("5aba5ad988385120a01b1ac2"), "fieldExists" : 4 } – Gianfranco P. 27 March 2018 в 15:14

Я нашел бесплатный инструмент для перевода запросов MYSQL в MongoDB. http://www.querymongo.com/ Я проверил несколько запросов. как я вижу, почти все они верны. В соответствии с этим, ответ

db.users.find({
    "name": "%m%"
});
2
ответ дан Lakmal Vithanage 19 August 2018 в 17:16
поделиться

В SQL запрос 'like' выглядит так:

select * from users where name like '%m%'

В консоли MongoDB он выглядит так:

db.users.find({"name": /m/})     // Not JSON formatted

db.users.find({"name": /m/}).pretty()  // JSON formatted

В дополнении pretty() метод будет во всех местах, где можно получить форматированную структуру JSON, которая более читаема.

6
ответ дан MAA 19 August 2018 в 17:16
поделиться

В PHP вы можете использовать следующий код:

$collection->find(array('name'=> array('$regex' => 'm'));
75
ответ дан Ondrej Slinták 19 August 2018 в 17:16
поделиться
  • 1
    python + mongoengine: people = People.objects.raw_query ({'name': {'$ regex': 'm'}}) – panchicore 13 August 2012 в 22:56
  • 2
    Если ваше значение RegEx исходит от пользовательского ввода (например, формы фильтра), и вы не хотите, чтобы это значение принималось как RegExp, вы можете применить к нему preg_quote (). – Philipp Rieber 11 August 2013 в 08:20
  • 3
    Я просто понял это, но на самом деле это неправильный ответ, хотя он работает, он не оптимален, вместо этого вы должны использовать фактический объект регулярного выражения BSON через MongoRegex, $ regex имеет проблемы совместимости с определенными командами типа $ in – Sammaye 24 September 2013 в 18:02
  • 4
    Этот синтаксис полезен, если значение хранится в переменной, поэтому запрос может быть записан как (в Ruby): $collection.where(field => {"$regex" => value}) – Donny Kurnia 16 April 2014 в 00:40
  • 5
    Но почему вы не можете использовать литералы массива? – Alper 22 March 2016 в 14:19

Подобно Query, как показано ниже

db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10);

для scala ReactiveMongo api,

val query = BSONDocument("title" -> BSONRegex(".*"+name+".*", "")) //like
val sortQ = BSONDocument("regularizedCorRelation" -> BSONInteger(1))
val cursor = collection.find(query).sort(sortQ).options(QueryOpts().batchSize(10)).cursor[BSONDocument]
4
ответ дан prayagupd 19 August 2018 в 17:16
поделиться
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()

Когда мы ищем строковые шаблоны, всегда лучше использовать приведенный выше шаблон, как если бы мы не были уверены в случае. Надеюсь, что это поможет !!!

1
ответ дан priya raj 19 August 2018 в 17:16
поделиться
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})

db.users.find({name: /a/})  //like '%a%'

out: paulo, patric

db.users.find({name: /^pa/}) //like 'pa%' 

out: paulo, patric

db.users.find({name: /ro$/}) //like '%ro'

out: pedro

242
ответ дан scwagner 19 August 2018 в 17:16
поделиться
  • 1
    хороший пример! Я нахожу проверку конца с пробелом и нашел это :) / $ / – Phuong 7 July 2017 в 05:16
  • 2
    как вы находите все записи для имени? или подстановочный знак для * в SQL? Что-то, что делает select name from users;, который просто перечисляет всех пользователей? – anon58192932 18 October 2017 в 19:15
  • 3
    @ anon58192932 Чтобы отобразить все записи только & quot; name & quot; поле в таблице с именем «пользователи», вы можете использовать метод project (), задав значения полей, которые вы хотите 1. Поля, которые не упоминаются в проекте (), не будут извлекаться, кроме _id. Поле _id печатается по умолчанию, которое вы можете подавить, поставив 0 значение для _id внутри метода project (). Что-то вроде - db.collection.find (). Project ({name: 1, _id: 0}) .toArray (функция (err, docs) {console.log (docs); callback (docs);}); См. Это - docs.mongodb.com/manual/tutorial/… – gauravparmar 15 February 2018 в 12:09

В проекте nodejs и использовании mongoose use Подобно запросу

var User = mongoose.model('User');

var searchQuery={};
searchQuery.email = req.query.email;
searchQuery.name = {$regex: req.query.name, $options: 'i'};
User.find(searchQuery, function(error, user) {
                if(error || user === null) {
                    return res.status(500).send(error);
                }
                return res.status(200).send(user);
            });
8
ответ дан Shaishab Roy 19 August 2018 в 17:16
поделиться
  • 1
    Как я могу использовать как запрос? Я пробовал это, но не работал: searchQuery.product_name = '/'+req.query.search.value+'/i'; – Muhammad Shahzad 10 May 2016 в 17:01
  • 2
    может попробовать: searchQuery.product_name= {$regex: req.query.search.value, $options: 'i'}; – Shaishab Roy 10 May 2016 в 18:59
  • 3
    Ты спасаешь моего чувака. вы можете немного объяснить, что такое $ regex и $ options? – Muhammad Shahzad 11 May 2016 в 16:26
  • 4
    if(req.query.search.value){ searchQuery.product_name = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_amount = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_person = {$regex: req.query.search.value, $options: 'i'}; searchQuery.department_name = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_date = {$regex: req.query.search.value, $options: 'i'}; } можете ли вы посмотреть, почему это не работает? – Muhammad Shahzad 11 May 2016 в 16:39
  • 5
    well $regex: 'value' генерирует регулярное выражение для вашего значения поиска, а $options: 'i' означает регистр, нечувствительный к регистру . Ваш код не работал, потому что вы использовали одно и то же значение для другого свойства и которые действуют как условие и , которое не должно выполняться с вашей коллекцией баз данных. – Shaishab Roy 12 May 2016 в 07:36

FullName как «последний» со статусом == «Ожидание» между двумя датами:

db.orders.find({
      createdAt:{$gt:ISODate("2017-04-25T10:08:16.111Z"),
      $lt:ISODate("2017-05-05T10:08:16.111Z")},
      status:"Pending",
      fullName:/last/}).pretty();

status == 'Ожидание' и orderId LIKE 'PHA876174':

db.orders.find({
     status:"Pending",
     orderId:/PHA876174/
     }).pretty();
1
ответ дан Shubham Verma 19 August 2018 в 17:16
поделиться

Есть уже много ответов. Я даю разные типы требований и решений для поиска строк с регулярным выражением.

Вы можете делать с регулярным выражением, которое содержит слово i.e. Также вы можете использовать $options => i для нечувствительного к регистру поиска

Содержит string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

Не содержит string только с регулярным выражением

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

Точный регистр нечувствителен string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

Начать с string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

Конец с string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

Сохранить this в качестве закладки и ссылку на любые другие изменения, которые могут вам понадобиться.

23
ответ дан Somnath Muluk 19 August 2018 в 17:16
поделиться

В качестве регулярного выражения поддержки Mongo shell это вполне возможно.

db.users.findOne({"name" : /.*sometext.*/});

Если мы хотим, чтобы запрос был нечувствительным к регистру, мы можем использовать опцию «i», как показано ниже:

db.users.findOne({"name" : /.*sometext.*/i});
3
ответ дан sravanthi 19 August 2018 в 17:16
поделиться

У вас уже есть ответы, но для соответствия регулярному выражению с нечувствительностью к регистру

Вы можете использовать следующий запрос

db.users.find ({ "name" : /m/i } ).pretty()

i в /m/i указывает на нечувствительность к регистру и .pretty() обеспечивает более симпатичный вывод

14
ответ дан The6thSense 19 August 2018 в 17:16
поделиться

В Go и драйвер mgo:

Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)

, где результатом является экземпляр структуры искомого типа

5
ответ дан user 19 August 2018 в 17:16
поделиться
  • 1
    PLS избегать неблокированных полей в литералах, вместо этого bson:RegEx{Pattern:"m", Options:"i"} – bithavoc 13 November 2016 в 18:33

Regex - дорогостоящий процесс.

Другой способ - создать индекс текста, а затем выполнить поиск с помощью $search.

Создать текст. Индекс полей, которые вы хотите сделать доступными для поиска:

db.collection.createIndex({name: 'text', otherField: 'text'});

Поиск строки в текстовом индексе:

db.collection.find({
  '$text'=>{'$search': "The string"}
})
2
ответ дан user3284463 19 August 2018 в 17:16
поделиться
  • 1
    Идеальное решение ... Regex's - путь к дорогостоящему. Работа с набором данных из 20-миллиметровых документов и разница в производительности очень заметны (что является преуменьшением) – nivensookharan 26 July 2018 в 09:28

У вас есть 2 варианта:

db.users.find({"name": /string/})

или

db.users.find({"name": {"$regex": "string", "$options": "i"}})

Во втором случае у вас есть больше опций, например «i» в параметрах, которые можно найти с использованием регистрозависимой чувствительности. И о «строке» вы можете использовать строку «. . » (% string%) или «строка. *» (Строка%) и строка «. *) (% String) для Например, вы можете использовать регулярное выражение, как хотите.

Наслаждайтесь!

13
ответ дан user3645907 19 August 2018 в 17:16
поделиться

Если вы используете Spring-Data Mongodb, вы можете сделать это следующим образом:

String tagName = "m";
Query query = new Query();
query.limit(10);        
query.addCriteria(Criteria.where("tagName").regex(tagName));
3
ответ дан Vaibhav 19 August 2018 в 17:16
поделиться

Для PHP mongo Нравится. У меня было несколько вопросов с php mongo. Я обнаружил, что объединение некоторых параметров regex помогает в некоторых ситуациях Поле поиска PHP mongo начинается с . Я полагал, что буду публиковать здесь, чтобы внести вклад в более популярную нить

, например

db()->users->insert(['name' => 'john']);
db()->users->insert(['name' => 'joe']);
db()->users->insert(['name' => 'jason']);

// starts with
$like_var = 'jo';
$prefix = '/^';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);
output: (joe, john)

// contains
$like_var = 'j';
$prefix = '/';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);

output: (joe, john, jason)
9
ответ дан Community 19 August 2018 в 17:16
поделиться
  • 1
    В соответствии с предыдущими ответами и комментариями поиск в формате $ text (Index) дает лучшее решение с эталонным сравнением по правилу $ regex. Для справки проверьте эту ссылку stackoverflow.com/questions/10610131/… . Можно ли реализовать метод $ text index с PHP и mongoDB – sankar muniyappa 2 April 2016 в 12:55
Другие вопросы по тегам:

Похожие вопросы: