2015-09-11 2 views
1

У меня есть некоторый поддокумент в MongoDB, который иногда включает в себя разные типы - строку, другой поддокумент, другой вложенный поддокумент и т. Д. Я пытаюсь создать запрос, который будет искать в этом субдокумент, независимо от его типа.Как найти вложенные субдокументы MongoDB в разных глубинах

Учитывая следующие документы:

{ name: "test1", content: "test contents"} 
{ name: "test2", content: {family: "tests family content", last: "another test content"} } 
{ name: "test3", content: {subdocument: {family: "super family contents", last: "last test content"} } } 

Я хочу использовать запрос, который будет искать во всех строках в пределах всех документов и поддокументов. Уже попробовал следующий запрос, но он возвращает только самое вложенный уровень поддокумента - content.subdocument.family:

{ $or: [ 
    {"content": {'$regex': '.*conten.*', '$options': 'i'}}, 
    {"content.family": {'$regex': '.*conten.*', '$options': 'i'}}, 
    {"content.last": {'$regex': '.*conten.*', '$options': 'i'}}, 
    {"content.subdocument.family": {'$regex': '.*conten.*', '$options': 'i'}}, 
    {"content.subdocument.last": {'$regex': '.*conten.*', '$options': 'i'}} 
]} 

Можно ли создать один запрос, который будет перебирать через все вложенные строки \ Пучину сразу?

+0

Это очень неясно, что вы просите. Пожалуйста, прочитайте [как спросить] (http://stackoverflow.com/help/how-to-ask) хороший вопрос и используйте ссылку [edit link] (http://stackoverflow.com/posts/32521668/edit), чтобы улучшите свой вопрос. – styvane

+0

Пытался отредактировать заголовок, введение и вопрос, надеюсь, теперь это лучше ... – Do5

+0

Кстати, в то же время, как обходной путь, я спрашиваю у пользователя, что глубоко он хочет искать. В противном случае также возможно создать 3 разных запроса, а затем проверить ответы позже. – Do5

ответ

0

Здесь вы отсутствуете синтаксис $or в $regex. Вы должны использовать $or как следующее:

db.collection.find({ 
    $or: [{ 
    "content": { 
     '$regex': '.*conten.*', 
     '$options': 'i' 
    } 
    }, { 
    "content.family": { 
     '$regex': '.*conten.*', 
     '$options': 'i' 
    } 
    }, { 
    "content.last": { 
     '$regex': '.*conten.*', 
     '$options': 'i' 
    } 
    }, { 
    "content.subdocument.family": { 
     '$regex': '.*conten.*', 
     '$options': 'i' 
    } 
    }, { 
    "content.subdocument.last": { 
     '$regex': '.*conten.*', 
     '$options': 'i' 
    } 
    }] 
}) 

Edit:

Выше запроса дает следующий результат:

[{ 
    "_id": ObjectId("55f41b6aef4766c946112a2d"), 
    "name": "test1", 
    "content": "test contents" 
}, { 
    "_id": ObjectId("55f41b6aef4766c946112a2e"), 
    "name": "test2", 
    "content": { 
    "family": "tests family content", 
    "last": "another test content" 
    } 
}, { 
    "_id": ObjectId("55f41b6aef4766c946112a2f"), 
    "name": "test3", 
    "content": { 
    "subdocument": { 
     "family": "super family contents", 
     "last": "last test content" 
    } 
    } 
}] 
+0

Вы правы, но это была опечатка при написании вопроса, к сожалению, это не решило проблему. – Do5

+0

@ Do5 Какой точный результат вы хотите? – Vishwas

+0

Я хочу, чтобы иметь возможность искать строку во всех возможных полях в «содержании». Структура вывода менее актуальна, это может быть весь документ, только соответствующее поле или только соответствующий поддокумент, который не имеет значения. – Do5

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