Mongodb - регулярное выражение ключей для вложенных документов - PullRequest
9 голосов
/ 02 сентября 2011

У меня есть несколько документов, сохраненных в коллекции (называемой urls), которые выглядят следующим образом:

{
    payload:{
        url_google.com:{
            url:'google.com',
            text:'search'
        }
    }
},
{
    payload:{
        url_t.co:{
            url:'t.co',
            text:'url shortener'
        }
    }
},
{
    payload:{
        url_facebook.com:{
            url:'facebook.com',
            text:'social network'
        }
    }
}

Используя CLI Mongo, можно ли искать вложенные документы payload, которые соответствуют /^url_/? И, если это возможно, можно ли будет запрашивать вложенные документы соответствия (например, убедитесь, что существует text)?

Я думал примерно так:

db.urls.find({"payload":{"$regex":/^url_/}}).count();

Но это возвращает 0 результатов.

Любая помощь или предложения будут великолепны.

Спасибо

Мэтт

1 Ответ

6 голосов
/ 03 сентября 2011

Невозможно запросить ключи документа таким способом. Вы можете искать точные совпадения, используя $exists, но вы не можете найти имена клавиш, которые соответствуют шаблону.

Я предполагаю (возможно, неправильно), что вы пытаетесь найти документы, которые имеют поддокумент URL, и что не все документы будут иметь это? Почему бы не выдвинуть информацию о типе ниже уровня, например:

{
  payload: {
    type: "url",
    url: "Facebook.com",
    ...
  }
}

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

db.foo.find({"payload.type": "url", ...})

Я также был бы упущен, если бы не заметил, что вам не следует использовать точки (.) - это имена ключей в MongoDB. В некоторых случаях возможно создание подобных документов, но это вызовет большую путаницу, когда вы попытаетесь выполнить запрос во встроенные документы (где Mongo использует точку в качестве «разделителя пути»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...