所以我正在研究一个代理,该代理应该从 MongoDB 获取数据,遍历它,然后找到具有相同值的密钥,并按升序对该列表进行排序。基本上,找出Mongo文档中有多少重复,然后对其进行排序。
所以我已经到了重复数据的部分,并计算它们,但我仍然坚持获得升序部分。
从 mongodb 获取文档并进行处理的代码如下。
function matchRoomAndAgent() {
var url = 'mongodb://192.168.10.10:27017';
MongoClient.connect(url, function (err, db) {
db.collection("whiteboardRooms").find({}).toArray(function (err, res) {
var roomsArray = [];
var count = {};
var temp_count = {};
if (err) {
throw err;
}
db.close();
// roomsArray.push(res);
for (var i = 0; i < res.length; i++) {
roomsArray.push(res[i]);
// console.log('agentId: '+ res[i][agentId].agentId);
}
// console.log(roomsArray);
for (var i = 0; i < 15; i++) //supposed to use length of roomsArray
{
var currentAgent = roomsArray[i].agentId;
for (var j = 0; j < 15; j++)
{
if (roomsArray[j].agentId == currentAgent)
{
count[j] = (count[j] || 0) + 1;
temp_count[j] = count[j];
}
}
console.log(temp_count);
}
另请参阅附件,mongodb文件的示例图片。
如果您需要更多信息,请与我们联系,我会尽力为您服务。我在编程方面有点像菜鸟。抱歉!
提前感谢您的帮助:)
答案 0 :(得分:2)
在某些时候,您可能希望限制所分组的材料,例如在两个时间戳之间按lastUpdateTime
限制,并且您不想将所有这些拖出数据库只是为了将其丢弃。这是解决方案的一般形式:
db.foo.aggregate([
{$match: {agentID: {$ne: " "}}} // guessing this is noise so filter out
// other $match could be used here to further shrink the data...
,{$group: {_id:"$agentID", n:{$sum:1}}}
,{$match: {n: {$gt:1}}} // ignore non-dupes
,{$sort: {_id: 1}} // and finally sort.
]);
答案 1 :(得分:1)
所以我已经找到了自己问题的答案。它几乎与 MongoDB 无关。 我基本上有一个名为 roomsArray 的数组,其中包含对象。我使用 groupBy 和 map 将这些对象投影到我想要的格式,然后使用 sort 作为数组,使用其长度来得到数。
我应该使用 groupBy()和 map()和 sort()来获取我需要的值。
var groupBy = function (array, key) {
return array.reduce(function(acc,val){
(acc[val[key]] = acc[val[key]] || []).push(val);
return acc;
}, {});
};
var result = groupBy(roomsArray, 'agentId');
// console.log(result);
var mapped = Object.keys(result).map(function(x){
return { agentId : x, rooms: parseInt(result[x].length)}
});
// console.log(mapped);
var sorted = mapped.sort((a,b) => a.rooms - b.rooms);
console.log(sorted);