Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 23, 2010 15:14:11

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

couchdb рисование таблички из key-value

Если я правильно понял то нужно что-то типа этого

function (doc) {
if (doc.type=='book')
emit(doc._id, {doc.show_title, doc.show_genre, doc.show_price});
}
далее

q = db.view.view_name(key=BOOK_ID).rows
if not q:
raise NotFound()
book = q[0].value
в book должно быть {“show_title”: “земля Санникова”, “show_genre”: “фантастика”, “show_price”: 100}



Отредактировано (Ноя. 23, 2010 15:16:09)

Офлайн

#2 Ноя. 23, 2010 16:42:35

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

couchdb рисование таблички из key-value

:)
что-то я не могу понять, зачем создавать map функцию, если вам нужно получить документ по id…



Офлайн

#3 Ноя. 23, 2010 19:15:07

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

couchdb рисование таблички из key-value

ofigetitelno
:)
что-то я не могу понять, зачем создавать map функцию, если вам нужно получить документ по id…
только если нужно получить не весь документ - а его часть
вы же не всегда пишите SELECT * FROM …
вдруг он большой например



Офлайн

#4 Ноя. 24, 2010 01:43:24

alexandre
От:
Зарегистрирован: 2010-11-16
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

couchdb рисование таблички из key-value

Я хотел создать мап функцию чтоб получить каким то образом все поля которые начинаются на show_ например в документе с {_id:“1”}, но как я понимаю написать подобный мап трудновыполнимо. Потому согласен что проще обойтись без мапа а по id получить документ и регулярными выражениями получить из него что нужно. Просто это уже небольшая обертка а хотелось бы чтоб функционал базы позволял это. А вообще это только мое виденье рисования таблички что один документ рисует шапку а во всех остальных просто есть {“type”:“1”} и они уже видом подгоняются под шапку. Может можно по другому изобразить это дело:).



Офлайн

#5 Ноя. 24, 2010 09:32:32

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

couchdb рисование таблички из key-value

alexandre
Я хотел создать мап функцию чтоб получить каким то образом все поля которые начинаются на show_ например в документе с {_id:“1”}, но как я понимаю написать подобный мап трудновыполнимо.
Ну почему трудновыполнимо - там стандртный JavaScript. Соответственно, Вы можете сделать что-то типа такого
function (doc) {
if (doc.type=='book') {
var keys = [];
for (var i in doc) {
if ( /^show_(\w)+$/.test(i)) keys.push(doc[i]);
}
emit(keys, doc._id);
}
}
Код примерный, не уверен, что будет работать на 100%.

Хотя, ПМСМ лучше емитировать не идентификатор документа, а сам документ или его часть, которую нужно показывать, тем самым снизив количество зпросов.



Отредактировано (Ноя. 24, 2010 09:54:57)

Офлайн

#6 Ноя. 24, 2010 12:06:48

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

couchdb рисование таблички из key-value

Офлайн

#7 Ноя. 26, 2010 01:34:51

alexandre
От:
Зарегистрирован: 2010-11-16
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

couchdb рисование таблички из key-value

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

def get_rex_doc(database, doc_id, pattern):
doc = database[doc_id]
result = {}
pattern = pattern+ur"[0-9a-zA-Z_]+"
for key in doc:
m = re.search(pattern, key)
# проверяет что в m чтото есть проверяем что он не нулллл
if m:
if m.group() == key:
getk = m.group()
result[getk] = doc[getk]
return result

def get_docs_on_type(db, view, pattern):
docs = db.view(view)
result = {}
for doc in docs:
result [doc['id']] = get_rex_doc(db, doc['id'], pattern)
return result
Первая функция выводит шапку таблицы вторая тело и соответственно их вызов:
from couch_lib import get_rex_doc, get_docs_on_type

couch = Server('http://127.0.0.1:5984')
db = couch['test']

a = get_rex_doc(db, "1", "show_")
for k in a:
print a.get(k)

a = get_docs_on_type(db, "_design/rb_docs/_view/show", "show_")
for k in a:
for kk in a[k]:
print a[k][kk],
print



Отредактировано (Ноя. 26, 2010 01:36:47)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version