Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
dima1208
0 / 0 / 0
Регистрация: 13.11.2017
Сообщений: 14
1

Delphi и MongoDB запросы

14.11.2017, 06:38. Просмотров 947. Ответов 8
Метки нет (Все метки)

Добрый день.
Есть база в монгоДБ, в коллекции с названием cash есть около 300 документов, в каждом документе есть поле IP. Необходимо сделать запрос для вывода всех IP из всех документов этой коллекции в memo. Использую FDMongoQuery. (Delphi 10.1).
Добавляю на форму MongoQuery, подключаю его к коллекции cash. На кнопку пишу код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.exportIP_btnClick(Sender: TObject);
var
  i: integer;
begin
    memo1.Clear;
    ipQuery.Close;
    ipQuery.QMatch:='{},{ip:1, _id: 0}';
    ipQuery.Open;
    for i:=0 to ipQuery.RecordCount-1 do
     begin
              cashIP:=ipQuery.FieldByName('ip').AsString;
              memo1.Lines.Add(cashIP);
              ipQuery.Next;
      end;
end;
Вроде работает, но добавляет только 50 первых записей. Пробовал limit, не помогает.

Самое интересное, что используя сторонний просмотрщик БД Robo 3T, он тоже показывает только 50 записей, даже если просто
раскрыть коллекцию. Хотя если там же открыть статистику коллекции - показывает корректное число записей (300).

Прошу помощи, что я делаю не так?

Заранее спасибо!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2017, 06:38
Ответы с готовыми решениями:

Запросы в Delphi
Здравствуйте! Помогите пожалуйста! Очень очень необходима ваша помощь! Есть...

Запросы в Delphi
Всем привет, я связал Базу данных Access и Делфи... Суть в том что я решил...

Запросы в Delphi
Здравствуйте Надо сделать БД читатель Читатель: Номер читательского билета,...

Запросы в Delphi
Здрасте. решил написать сюда... имеется таблица Vopros, поля tema и vopr. в...

Delphi запросы
Помогите пожалуйста, надо сделать для этого проекта, 5 простых запросов и 5...

8
qwertehok
2321 / 2222 / 605
Регистрация: 29.08.2013
Сообщений: 14,879
14.11.2017, 19:21 2
Лучший ответ Сообщение было отмечено dima1208 как решение

Решение

вы попались на распространенную штуку с RecordCount

по умолчанию в FD это значение равно 50 и вы получили только 50 строк

вот тут меняйте цикл
Цитата Сообщение от dima1208 Посмотреть сообщение
for i:=0 to ipQuery.RecordCount-1 do
на
Delphi
1
while not query.eof do
или использовать query.fetchall (вроде так)
1
dima1208
0 / 0 / 0
Регистрация: 13.11.2017
Сообщений: 14
15.11.2017, 06:27  [ТС] 3
qwertehok, огромное спасибо, все работает!)
0
dima1208
0 / 0 / 0
Регистрация: 13.11.2017
Сообщений: 14
23.11.2017, 08:27  [ТС] 4
Добрый день. Подниму тему, так как возникла новая проблема.
Теперь нужно в дополнение к IP из коллекции cash брать данные из коллекции shop (title и code).
Коллекция cash связана с коллекцией shop (shop._id=cash.parent.$id. Эти id совпадают в обеих коллекциях)

Теперь стоит задача в memo через точку с запятой добавить (ip из cash)+code(из shop)+title(из shop), для последующего сохранения в csv.

Сначала пробовал сделать второй query по аналогии с первым, а в цикле указать оба query (пробовал разные вариации), но выдает не то что нужно, то после ip пустые значения, то на первый взгляд правильно, но не совпадают ip и коды и в конце последний ip дублируется.

Каким образом нужно составить запрос(ы), чтобы получить нужный список? Понимаю, что нужно указать в запросе индексы, но как это сделать совершенно не понимаю. Может нужно создать еще один query и в запросе указать данные из первых двух? Но как?

Уважаемые знатоки, прошу помощи...

Заранее спасибо.
0
qwertehok
2321 / 2222 / 605
Регистрация: 29.08.2013
Сообщений: 14,879
23.11.2017, 15:12 5
нужна помощь с делфи или с запросами в вашей СУБД?
0
dima1208
0 / 0 / 0
Регистрация: 13.11.2017
Сообщений: 14
23.11.2017, 15:24  [ТС] 6
qwertehok, нужно из делфи сделать запрос mongoquery. СУБД сторонняя, изменять нельзя, можно только брать данные. Не могу понять как сделать запрос из двух коллекций с индексами.
0
qwertehok
2321 / 2222 / 605
Регистрация: 29.08.2013
Сообщений: 14,879
23.11.2017, 15:30 7
Цитата Сообщение от dima1208 Посмотреть сообщение
Не могу понять как сделать запрос из двух коллекций с индексами.
запросы лучше обсуждать в теме по данной СУБД
0
dima1208
0 / 0 / 0
Регистрация: 13.11.2017
Сообщений: 14
04.07.2018, 09:01  [ТС] 8
Всем добрый день.

Снова возник вопрос и теперь точно дело не в субд.

Программа работала, корректно брала данные, а именно ip адрес и код из двух коллекций и все это дело экспортировала в csv файл.

Сегодня заметил проблему: пока ip адреса были вида 10.9.[1-9].xxx - все было нормально, но когда в айпи адресе третий октет стал 10 и больше, то в четвертом октете последняя цифра обрезается, то есть в списке появляются 2-10 адресов 10.9.11.23 с разными кодами. Получается в колонке максимум 10 символов. При этом во второй колонке все корректно, отображается код вида _cash_0200002978661_c18f9ead.

В самой базе данных все ip адреса правильные, оба поля имеют тип данных string.

Вот весь код на кнопке:

Delphi
1
2
3
4
5
6
7
8
9
10
11
    ipQuery.Close;
    ipQuery.QMatch:='{},{parent.$id:1, ip:1, displayCode:1, _id: 0}';
    ipQuery.Open;
 
    while not ipQuery.Eof do
     begin
              ip:=ipQuery.FieldByName('ip').AsString;
              title:=ipQuery.FieldByName('_id').AsString;
              memo1.Lines.Add(ip+';'+title);
              ipQuery.Next;
      end;
На форме один mongoquery. Пытался менять его параметры где упоминается trim - либо не запускается программа, либо ничего не меняется. В коде менял asstring на aswidestring, asansistring - не меняется результат.

Подскажите, пожалуйста, куда копать?

Заранее спасибо.
0
dima1208
0 / 0 / 0
Регистрация: 13.11.2017
Сообщений: 14
06.07.2018, 08:37  [ТС] 9
Нашел подобную проблему в инете, разработчик пишет определить правило в редакторе fdconnection:
Delphi
1
2
3
4
5
6
  FormatOptions.OwnMapRules = True
    FormatOptions.MapRules = <
      item
        SourceDataType = dtWideString
        TargetDataType = dtWideMemo
      end>
Не помогло...
0
06.07.2018, 08:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2018, 08:37

Запросы в Delphi
нужно сделать запрос &quot;стаж работников больше 25&quot; Ссылка на прогу

delphi запросы
Доброе время суток! в элемент TADOQuery расматриваю данные там есть столбцы...

Запросы в Delphi
Здравствуйте. Не получается написать SQL запрос в Delphi с помощью компоненты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru