gpt4 book ai didi

javascript - 在 CouchDB 的 MapReduce 中选择属于一个用户的 n 个元素

转载 作者:行者123 更新时间:2023-11-30 10:51:31 25 4
gpt4 key购买 nike

请多多包涵,我对整个 CouchDb 都是新手。

数据库看起来像:

** item ** count ** user **
A 20 bob
B 30 bob
C 10 bob
D 15 john

我想写一个 MapReduce 来选择属于 bob 的所有项目并且只返回前 2 个,排序。所以它应该返回 [{item:"B",count:"30"},{item:"A",count:"20}]

我不确定如何做到这一点?好像我必须发出(doc.item,doc.count),但我怎么知道用户是否拥有该文档?如何运行另一个 MapReduce 来选择顶部元素?

最佳答案

一个解决方案是编写您的 View 以使用复杂的键,例如:

function (doc) {
emit([doc.user, doc.count], doc.item);
}

如果您将 descending=true 添加到您的查询字符串中,您将得到如下 View 结果:

{"total_rows":4,"offset":0,"rows":[
{"id":"53f359b7cd360da296dd9aab3d0029bd","key":["john",15],"value":"D"},
{"id":"53f359b7cd360da296dd9aab3d001a0e","key":["bob",30],"value":"B"},
{"id":"53f359b7cd360da296dd9aab3d000fec","key":["bob",20],"value":"A"},
{"id":"53f359b7cd360da296dd9aab3d002668","key":["bob",10],"value":"C"}
]}

它已经按用户排序,然后计数。 (以项目类型为值)

然后你可以使用 _list function做剩下的事。下面的代码基本上遍历 View ,并为每个用户返回前 2 个结果。如果您在查询字符串中指定 user=bob,您将只获得 bob 的结果。

function (head, req) {
// specify that we're sending JSON as our response
provides('json', function () {
var results = [],
result, user, count, row;

while (row = getRow()) {
// if the user doesn't match the last iteration, reset our counter
if (user != row.key[0]) {
user = row.key[0];
count = 0;
}

// we only need the top 2
if (count++ >= 2) {
continue;
}

// start building a result object
result = {
item: row.value,
count: row.key[1]
};

// if we provide user=?
if (req.query.user) {
// check to see if it matches the current user
if (req.query.user === user) {
// if so, add it to the results
results.push(result);
}
// by default, we'll return the top 2 for every user
} else {
// add the user key to the result object
result.user = row.key[0];
// and add it to the result set
results.push(result);
}
}

// send outside the loop, since it needs to be sent as valid JSON
send(JSON.stringify(results));
});
}

关于javascript - 在 CouchDB 的 MapReduce 中选择属于一个用户的 n 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5025239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com