2015-11-24 21 views
0

我與下面的模式工作,我只所示的與此有關的部分:MongoDB的 - 從JavaScript數組創建MongooseDocumentArray

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中找到的日期的文檔版本?

回答

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); 
}); 
+0

於是,我就帶你寫了什麼我簡單的例子,它適應我的項目,它不是很實用。下面是一個簡單的代碼片段: http://i.imgur.com/B2vfqFr.png ,但在行outArr.push ...衝不包含衝頭字段中的值,在這裏看到: HTTP ://i.imgur.com/JyHFjCT.png 任何想法爲什麼拳不能正確構建?我認爲這可能與新的Date()的格式有關,但沒有得到任何地方。 這裏是我的服務器模型,包含模式,如果有幫助: http://i.imgur.com/0lXLfhM.png – Trofee

+1

您的punch模式上聲明的屬性是punch而不是日期。 –

+0

是的,那會是問題,不知道爲什麼我沒有接受。非常感謝,它的全部工作! – Trofee