2016-04-13 3 views
0

Моей коллекции походитМонго DB, как сделать поиск с полем содержит целое число

Name : "name" Serial:"100" Name : "name1" Serial:"4200" Name : "name2" Serial:"1200" 

Мне нужно найти документы, которые содержат Name, который содержит значение "name" или Serial, содержащий "200"

Спасибо много для ваших рекомендаций здесь.

ответ

0

если у вас есть данные, как это:

{ "_id" : ObjectId("..."), "name" : "nameA", "serial" : 1200 } 
{ "_id" : ObjectId("..."), "name" : "nameB", "serial" : 1234 } 
{ "_id" : ObjectId("..."), "name" : "nameC", "serial" : 4200 } 

и вы хотите запросить на поле serial с регулярным выражением, вы можете сделать агрегацию:

db.coll.aggregate(
    {$project: {name: true, serial: {$toLower: '$serial'}}}, 
    {$match: {serial: /20/}}) 
) 
// { "_id" : ObjectId("..."), "name" : "nameA", "serial" : "1200" } 
// { "_id" : ObjectId("..."), "name" : "nameC", "serial" : "4200" } 

db.coll.aggregate(
    {$project: {name: true, serial: {$toLower: '$serial'}}}, 
    {$match: {serial: /12/}}) 
) 
// { "_id" : ObjectId("..."), "name" : "nameA", "serial" : "1200" } 
// { "_id" : ObjectId("..."), "name" : "nameB", "serial" : "1234" } 

, но это хак, я бы не стал используйте этот подход в своей работе. Может быть, есть способ реорганизовать вашу структуру данных?

И вы должны знать, что вы не можете использовать какие-либо индексы с этим запросом, mongo выполнит полное сканирование таблицы.

Надеюсь, я правильно понял ваш вопрос;).

+0

Он не дал мне лучшее решение .AN пример ниже> db.Legacy_details.findOne() -------- Коллекция { "_id": ObjectId ("573d8f5eeb55cc97e9c07aa5"), «Array ": 290103590, "Device": "10000000c987856d", "Host": ""} > db.Legacy_details.find ({" массив ":" 290103590 "}) > db.Legacy_details.find ({" Array ":/290103590 /}) > – MRz

+0

Извините, но я не понимаю вас. Если вы хотите искать только часть строки, используйте regex, я вижу, вы знаете об этом. Если вам нужна дизъюнкция, используйте «$ или», как я. – evilive

+0

Ну, думаю, я понял, если не поправлю меня. У вас есть int field, и вам нужно частичное совпадение с ним? Хорошо, я могу предложить вам использовать функцию агрегата. Сначала вы должны преобразовать значения int в строки, а затем сопоставить их с вашим запросом. Для преобразования ints в строку просто используйте модификатор '$ toLower'. – evilive

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