Несмотря на то, что ответ Сэма - это хороший пример для подражания, я хотел бы отметить, что, действительно, есть хороший способ добавить документ Couch. Это пока не очень хорошо задокументировано.
Определяя функцию update
в вашем проектном документе и используя ее для добавления к массиву внутри внутреннего документа, вы можете сэкономить значительное дисковое пространство. Кроме того, вы получите соотношение 1: 1 между файлом, к которому вы входите, и документом, который представляет этот файл. Вот как я могу представить документ:
{
"_id": "some/file/path/name.txt",
"_rev": "32 char hash",
"accesses": [
{"at": 1282839291, "by": "ben"},
{"at": 1282839305, "by": "kate"},
{"at": 1282839367, "by": "ozone"}
]<br>
}
Одно предостережение: вам нужно будет закодировать "/" как% 2F, когда вы запросите его у CouchDB, или вы получите ошибку. Использование слешей в идентификаторах документов вполне нормально.
А вот пара функций отображения / уменьшения:
function(doc)
{
if (doc.accesses) {
for (i=0; i < doc.accesses.length; i++) {
event = doc.accesses[i];
emit([doc._id, event.by, event.at], 1);
}
}
}
function(keys, values, rereduce)
{
return sum(values);
}
И теперь мы можем увидеть еще одно преимущество хранения всех обращений к данному файлу в одном документе JSON: чтобы получить список всех обращений к документу, просто сделайте запрос на получение соответствующего документа. В этом случае:
GET <a href="http://127.0.0.1:5984/dbname/some%2Ffile%2Fpath%2Fname.txt" rel="nofollow noreferrer">http://127.0.0.1:5984/dbname/some%2Ffile%2Fpath%2Fname.txt</a>
Если вы хотите посчитать, сколько раз каждый файл был доступен каждому пользователю, вы запросите представление следующим образом:
GET <a href="http://127.0.0.1:5984/test/_design/touch/_view/log?group_level=2" rel="nofollow noreferrer">http://127.0.0.1:5984/test/_design/touch/_view/log?group_level=2</a>
Используйте group_level = 1, если вы просто хотите подсчитать общее количество обращений на файл.
Наконец, вот функция update
, которую вы можете использовать для добавления в этот массив doc.accesses:
function(doc, req) {
var whom = req.query.by;
var when = Math.round(new Date().getTime() / 1000);</p>
<p>if (!doc.accesses) doc.accesses = [];
var event = {"at": when, "by": whom}
doc.accesses.push(event);
var message = 'Logged ' + event.by + ' accessing ' + doc._id + ' at ' + event.at;
return [doc, message];
}
Теперь, когда вам нужно зарегистрировать доступ к файлу, отправляйте запрос, подобный следующему (в зависимости от того, как вы называете свой проектный документ и функцию обновления):
<a href="http://127.0.0.1:5984/my_database/_design/my_designdoc/_update/update_function_name/some%2Ffile%2Fpath%2Fname.txt?by=username" rel="nofollow noreferrer">http://127.0.0.1:5984/my_database/_design/my_designdoc/_update/update_function_name/some%2Ffile%2Fpath%2Fname.txt?by=username</a>