【问题标题】:MongoDB - Create MongooseDocumentArray from Javascript ArrayMongoDB - 从 Javascript 数组创建 MongooseDocumentArray
【发布时间】:2016-02-27 15:01:23
【问题描述】:

我正在使用以下架构,我在这里只展示了相关部分:

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 arrays mongodb mongoose mongodb-query


    【解决方案1】:

    您需要将 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);
    });
    

    【讨论】:

    • 所以我尝试采用您为我的简化示例编写的内容并将其调整到我的项目中,但它不是很实用。这是一个快速的代码 sn-p:i.imgur.com/B2vfqFr.png 但在 outArr.push 行... 打孔的值不包含打孔字段,请参见此处:i.imgur.com/JyHFjCT.png 知道为什么打孔不能正确构造吗?我认为这可能与 new Date() 的格式有关,但没有得到任何结果。这是我的包含模式的服务器模型,如果有帮助的话:i.imgur.com/0lXLfhM.png
    • 在您的打孔架构上声明的属性是打孔而不是日期。
    • 是的,这就是问题所在,不知道为什么我没听明白。非常感谢,它可以正常工作!
    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 2016-02-06
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多