将MongoDB查询结果转换为JSONArray

Convert MongoDB query result into JSONArray

本文关键字:JSONArray 转换 结果 MongoDB 查询      更新时间:2023-09-26

我有一个MongoDB通过mongoose查询,结果是:

[
  {
    "tablename": "name1"
  },
  {
    "tablename": "name2"
  }
]

但我需要它作为JSONArray:

{
  "tablename": [
    "name1",
    "name2"
  ]
}

是否有一个简单的方法转换?

聚合框架可以为您创建所需的结果。考虑 $group $push 累加操作符如下:

db.collection.aggregate([
    {
        "$group": {
            "_id": null,
            "tablename": {
                "$push": "$tablename"
            }           
        }
    },
    {
        "$project": {
            "_id": 0, "tablename": 1
        }
    }    
])
样本输出:

/* 0 */
{
    "result" : [ 
        {
            "tablename" : [ 
                "name1", 
                "name2"
            ]
        }
    ],
    "ok" : 1
}

你可以使用 aggregate() 方法在mongoose中实现这个,例如:

var pipeline = [
        {
            "$group": {
                "_id": null,
                "tablename": {
                    "$push": "$tablename"
                }           
            }
        },
        {
            "$project": {
                "_id": 0, "tablename": 1
            }
        }    
    ]
Model.aggregate(pipeline).exec(function (err, res){
    console.log(res);
})

修改此查询以使用聚合框架:

app.post('/getkost', function(request, response){ 
    var kost = new RegExp(request.body.kost,'i'); 
    Move.find(
        { tablename: { $regex: kost } },
        { tablename: 1, _id: 0 }, 
        function(err, doc) { 
            response.json(doc); 
    }); 
});

:

app.post('/getkost', function(request, response){ 
    var kost = new RegExp(request.body.kost, 'i'); 
    var pipeline = [
        {
            "$match": {
                "tablename": { "$regex": kost }
            }
        },
        {
            "$group": {
                "_id": null,
                "tablename": {
                    "$push": "$tablename"
                }           
            }
        },
        {
            "$project": {
                "_id": 0, "tablename": 1
            }
        }
    ]
    Move.aggregate(pipeline, function(err, res) { 
        response.json(res); 
    }); 
});

try…

var inputArr = [
  {
    "tablename": "name1"
  },
  {
    "tablename": "name2"
  }
];
var jsonArr = {"tablename": []};
for (var i = 0; i < inputArr.length; i++) {
  jsonArr.tablename.push(inputArr[i].tablename);
}

这应该可以为您工作:

var json = [{
    "tablename": "name1"
}, {
    "tablename": "name2"
}]
var arr = {};
json.forEach(function(value, key) {
    var tableName = Object.keys(json[key]);
    arr[tableName] = arr[tableName] || [];
    arr[tableName].push(value[tableName]);
});
console.log(arr);

小提琴

请记住,Object.keys()将实际返回一个数组-如果您的数组包含多个键(例如{"tablename": "name1", "othertablename": "name2"})