在 MongoDB 中 InsertMany 不起作用

8

我是一名新手,刚接触Mongoose和MongoDB,现在我正在尝试使用insertMany方法来保存一堆文档,但是它无法保存文档。

这是我的代码:

模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;


var hostSchema = new Schema({
    hostname: String,
    timestamp: Number,

});

var hostModel = mongoose.model('host', hostSchema, 'host');

module.exports = hostModel;

ExpressJS POST路由

var mongoose = require('mongoose');
var hostModel = require('../../models/Host');

router.post('/host', function (req, res, next) {
    var payload = req.body;

    (async function(){
        var host = new hostModel();

        const insertMany = await hostModel.insertMany(payload.data);

        console.log(JSON.stringify(insertMany,'','\t'));

        const saveMany = await hostModel.save();

        res.status(200).send('Ok');
    })();
});

console.log显示了记录,但是当我执行hostModel.save()时,出现了hostModel.save不是一个函数的错误提示。

我应该如何保存插入的文档?

非常感谢您的帮助!


请使用以下链接查看有关MongoDB Mongoose插入不是函数的详细信息:https://dev59.com/5Jfga4cB1Zd3GeqPBdKO#68662249 - Sonu P.
2个回答

5

这里不需要创建实例 new hostModel()... 直接使用 hostModel,也不需要调用 save(),因为插入多个对象本身就会创建集合... 确保 payload.data 是一个对象数组

router.post('/host', function (req, res, next) {
  const array = [{hostname: 'hostname', timestamp: 'timestamp'},
                 {hostname: 'hostname', timestamp: 'timestamp'}]

    var payload = req.body;

    (async function(){

        const insertMany = await hostModel.insertMany(array);

        console.log(JSON.stringify(insertMany,'','\t'));

        res.status(200).send('Ok');
    })();
});

1
我尝试过了,但我仍然无法将文档保存到集合中。根据Mongoose文档,insertMany不会触发保存中间件。不管怎样,还是谢谢 :-) - Marrone
这是我的数据数组"data": [ { "hostname": "localhost", "timestamp": 1527668059689 } ] 显然它包含不止一个项目...只是举了一个例子。 - Marrone
仍然是相同的结果,使用硬编码的项目...没有保存。 - Marrone
1
这是console.log(insertMany)的结果:[ { "_id": "5b0e5e95b5f6844c5a8d5f02", "hostname": "localhost", "timestamp": 1527668059689, "__v": 0 }, { "_id": "5b0e5e95b5f6844c5a8d5f03", "hostname": "localhost", "timestamp": 1527668059789, "__v": 0 } ]。它获取了返回的ID...有点奇怪没有被保存。 - Marrone
嗨@Marrone,我遇到了类似的问题。你能解决这个问题吗? - Lizzy
嗨@Lizzy,请检查我的答案。我已经转移到使用“criteria”的updateMany。 - Marrone

0
对于那些遇到相同问题的人,我已经使用以下criteriaupdateMany解决了它:
router.post('/heatmap', function (req, res, next) {
    let payload = req.body;

   (async function(){

        let heatmapDate = new Date(payload[0].heatmapdata[0].timestamp).toISOString().substring(0, 10);

        payload[0].heatmapDate = heatmapDate;

        let sessionData = payload[0];

        sessionData.sessionrecordheatmap = payload[0].heatmapdata;

        let criteriaSession = {
            sessionId:{ $eq: payload[0].sessionId}
        };

        const updatetManySession = await updateManySessionRecord(sessionrecordModel, criteriaSession, sessionData);

        res.status(200).send(updatetManyHeatmap);
    })();
});

async function updateManySessionRecord(schema, criteria, data){
    return new Promise((resolve, reject) => {
        schema.updateMany(criteria, 
            {
                id: data.id,
                clientIp: data.clientIp,
                device: data.device,
                heatmapDate: data.heatmapDate,
                protocol: data.protocol,
                hostname: data.hostname,
                pagePath: data.pagePath,
                pageImage: data.pageImage,
                pageTitle: data.pageTitle,
                clientHeight: data.clientHeight,
                clientWidth: data.clientWidth,
                $push: {
                    sessionrecordheatmap: data.sessionrecordheatmap,
                }
            },
            { 
                multi: true,
                upsert: true
            }, 
            function(err, res) {
                if (err) { 
                    console.log('ERROR - UPDATE MANY SESSIONRECORD: ' + err);
                    reject('insertFirst');
                } 
                else{ 
                    resolve('ok')
                }
            });
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接