MongoDB文档:查找重复次数并按升序排序

时间:2017-10-02 12:10:34

标签: javascript mongodb

所以我正在研究一个代理,该代理应该从 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文件的示例图片。

MongoDB Documents

如果您需要更多信息,请与我们联系,我会尽力为您服务。我在编程方面有点像菜鸟。抱歉!

提前感谢您的帮助:)

2 个答案:

答案 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);