2016-12-02 13 views
0

Я пытаюсь создать пользовательские виды на couchBase из Node.js. Вот код, у меня естьКак установить входную переменную как ключ в json при создании представления в couchBase

app.post("/todo/:id", function(req, res){ 
console.log("hey" + req.body.userId) 
    baseview.setDesign('design_users', { 
    "$req.body.userId": { 
     'map': "function (doc, meta) { if(doc.toUserName == req.body.userId) {emit(doc.status, doc.title);}}" 
     } 
    }, 
    function(err, result){ 
     if (err != null) console.log(err); 
     else res.send(result) 
    } 
); 
}) 

Исполняя следующий завиток

curl -H "Content-Type: application/json" -X POST -d '{"userId": "uidam231"}' http://localhost:3000/todo/id 

Хотя design_users документ дизайн создан на couchBase, ожидаемый вид (uidam231) нет. На консоли нет ошибок.

Я подозреваю, что назначение переменной req.body.userId в json, вероятно, является причиной. Обратите внимание, что имя представления («$ req.body.userId»:) и критерии фильтра (doc.toUserName == req.body.userId) нуждаются в переданной переменной.

Любые предложения, пожалуйста?

ответ

1

Невозможно передать переменную в функцию карты в представлении, потому что map() и reduce() используются не для запроса данных, а для построения индекса, материализованного представления данных в ведре, а позже вы можете сделать фильтрации, ранжирования, сортировки, но на основе ключей, которые вы выбрали для ввода в этот индекс во время сборки (т. е. когда была выполнена карта). Если ставить его просто, база данных запускает вашу функцию карты один раз для всего набора данных, а затем для каждого нового/измененного документа обновлять индекс. Вот почему вы не можете передавать или использовать параметры из запроса, или делает бессмысленное использование new Date() или Math.random() в некоторых случаях, поскольку их значения будут оцениваться только один раз для каждого документа во время сборки индекса, но не для времени запроса.

Что вы должны делать в вашем случае, чтобы построить функцию карты, как это:

function (doc, meta) { 
    emit(doc.toUserName, [doc.status, doc.title]); 
} 

Это даст вам просматривать индекс, где имя пользователя является ключом, и статус, и название это значение. Чтобы вы могли запросить просмотр с использованием аргумента key= и передать там идентификатор пользователя.

Дополнительная информация:

  1. Querying Data with Views
  2. MapReduce Views
+0

Привет @avsej: Я понимаю эту часть. То, что я пытаюсь достичь, это, скажем, при регистрации нового пользователя, я хотел бы добавить (пользовательский) вид (ы) к couchBase. Думаю, я мог бы также запустить скрипт для добавления просмотров на основе каждого пользователя. По сути, это не запрос. Просто представление, где функция карты проверяет определенное значение, например, число или строку. Только то, что вид вставлен (только один раз для каждого нового зарегистрированного пользователя) из Node.js – user1384205

+0

В этом случае вы должны подставить имя пользователя как литерал в 'function() вместо' req.body.userId', а также в просмотреть имя. Но вы должны иметь в виду, что вы не можете обновлять/добавлять только один вид, вам приходится каждый раз перезаписывать весь проектный документ. Может, N1QL решит вашу проблему? – avsej

+0

У NiQL, по-видимому, более высокая латентность над представлениями. Различия, которые я планирую смягчить с помощью couchbase lite на клиенте. Я все еще не могу понять, переходя к буквальной части в вышеупомянутой проблеме. – user1384205