MongoDB-从Javascript数组创建MongooseDocumentArray

MongoDB - Create MongooseDocumentArray from Javascript Array

本文关键字:创建 MongooseDocumentArray 数组 Javascript MongoDB-      更新时间:2023-09-26

我正在使用以下模式,这里只显示了相关部分:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;
    var punchSchema = new Schema({punch: Date});
/**
 * Child Schema
 */
var ChildSchema = new Schema({
    punchesIn: [punchSchema]
});
mongoose.model('Child', ChildSchema);

我试图实现的是能够获取一个子文档,并从javascript数组中更新punchesIn字段。所以如果我有:

Child1{
    _id: XYZ
    punchesIn: [Date1, Date2, Date3]
}
jsArray = [Date4, Date2, Date5]

我将能够运行更新,Child1将变成:

Child1{
    _id: XYZ
    punchesIn: [Date4, Date2, Date5]
}

这是我尝试的一个简化版本,实际实现中没有语法错误,这只是为了展示:

Child.findById(XYZ, function(err, child) {
    var query = {'_id': XYZ };
    var update = {  $set: {
                        punchesIn: jsArray
                    },
                 };
    var options = { new: true };
    Child.findOneAndUpdate(query, update, options, function(err, child) {
        if (err) {
            console.log('got an error');
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        }
    });

运行这段代码(我知道它适用于文档中的非数组字段)会导致以下错误:

500 TypeError: Cannot use 'in' operator to search for '_id' in punchesIn

据我所知,这是因为punchesIn属于MongooseDocumentArray类型,而jsArray只是一个javascript数组。

是否可以运行某种循环来创建MongooseDocumentArray,其中不同的字段是jsArray中日期的文档版本?

您需要将javascript数组转换为Punch模型实例的数组,因为这是Child模式所期望的。这里有一个功能:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var punchSchema = new Schema({punch: Date});
var childSchema = new Schema({
    punchesIn: [punchSchema]
});
var Child = mongoose.model('Child', childSchema);
var Punch = mongoose.model('Punch', punchSchema);
function createPunchList(inArr){
    var outArr = [];
    for (var i=0;i<inArr.length;i++){
        var punch = new Punch({
           date: inArr[i]
        });
        outArr.push(punch);
    }
    return outArr;
}
//test data
for (var i=0;i<10;i++){
    var newChild = new Child({
       punchesIn: createPunchList([new Date(), new Date(), new Date()])
    });
    newChild.save();
}
Child.find({}, function(err, c){
    console.log(c);
});