Мой json:
{
user_id: "131231",
user_name: "John",
boxes:[
{
box_name: "Box 1"
},
{
box_name: "Box 2"
}
]
}
Я пытаюсь найти блок 1 с таким запросом:
db.users.find({$text: {$search: "Box"}})
Но mongo ничего не может найти, несмотря на то, что может найти user_name с этим:
db.users.find({$text: {$search: "John"}})
Пробовал на createIndex.
Я новичок в MongoDB. Спасибо за вашу помощь ...
Правильно ли вы создали индекс для вложенного объекта? Например: createIndex({ 'boxes.boxname' : 'text' });
Я понял, что MongoDB принимает только один текстовый индекс. Прежде всего, я удалил весь индекс для этой коллекции с помощью db.test2.dropIndex( "*" );, затем я просто попробовал createIndex({ 'boxes.box_name' : 'text' });, и все заработало. Извините за трату вашего времени



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш индекс должен включать оба поля:
createIndex({ 'user_name' : 'text', 'boxes.box_name': 'text' })
Вы получили IndexOptionsConflict, потому что в этой коллекции у вас уже был индекс text, и у вас не может быть другого. Как только вы сделаете вышеуказанный индекс, эти два должны работать:
db.users.find({$text: {$search: "John"}})
db.users.find({$text: {$search: "Box"}})
Спасибо @Akrion, вы правы. Кстати, если вы хотите удалить все текстовые индексы, вы можете попробовать db.users.dropIndex( "*" );
Кажется, что db.users ищет на корневом уровне объекта. боксы - это массив объектов со свойствами box_name. Ваш поиск не будет углубляться в этот вложенный массив объектов. Вы пытались "развернуть массив и спроецировать новый набор свойств, по которым хотите выполнять поиск? Если вы просматриваете массив, вам нужно будет выполнить поиск в массиве, поэтому что-то вроде db.users.boxes может сработать. Позвольте нам знаю, что вы пробовали, и я могу опубликовать рабочий образец.