Найти ссылку на поле документа в mongo

#mongodb #perl #mongodb-query

#mongodb #perl #mongodb-запрос

Вопрос:

У меня есть коллекция с документами с такой структурой:

 {
  'travellers': [ 'a', 'b', 'c', 'd' ],
  ...
  'authorized-travellers': {
    'a' => {
        creator => 'admin',
        authorized => true,
        when => '2016-18-10 22:45:45',
    },
    'd' => {
        creator => 'admin',  
        authorized => false,
        when => '2016-17-10 12:44:00',
    },
  }
}
  

и мне нужен запрос, чтобы найти все документы, которые имеют ожидающие авторизации путешественников.

Путешествие (документ) имеет ожидающие авторизации путешественников, если travellers.count меньше ключей «авторизованные путешественники».

В этом примере это путешествие имеет 2 ожидающих авторизации: b и c.

Если это возможно (в perl) или мне нужно выполнить запрос вручную? Как?

Спасибо

Комментарии:

1. Хорошо, можете ли вы сообщить мне, как это сделать?

2. @simbabque: С нетерпением жду, чтобы узнать от вас различия между ними.

3. @ssr1012 Perl — это название языка. perl — это имя компилятора Perl (двоичного файла, который запускает код Perl). PERL не имеет ничего общего с языком Perl. Вы можете прочитать в Википедии , но наиболее важным источником является perlfaq1 , где написано, но никогда не пишется «PERL», потому что perl не является аббревиатурой ..

4. @simbabque: Исправился. Спасибо.

5. Может быть, это поможет вам

Ответ №1:

Нет простого способа сделать это на стороне сервера. Возможно, вам удастся создать функцию $where .

Если возможно, я бы хотел пересмотреть схему, чтобы сохранить ожидающий подсчет (или логический флаг) в качестве инварианта в самом документе. При обновлении travellers и authorized-travellers pending одновременно обновляйте счетчик / флаг как атомарную операцию. Тогда запрос на ожидающие авторизации был бы тривиальным.

Чтобы обновить существующие документы, чтобы добавить инвариант, вам нужно быть осторожным с данными, если они часто обновляются.

Если изменение схемы невозможно, то перебирать документы на стороне клиента и проверять их по отдельности просто, хотя и неэффективно. Если документов много и в документе много данных, убедитесь, что вы проецируете только те поля, которые вам нужны.

Надеюсь, эти идеи помогут.