2013-03-11 77 views
3

我遇到了嵌入式文檔的怪異行爲,我不知道我是否做錯了什麼,或者它是一個錯誤。爲什麼貓鼬用「[object Object]」替換子文檔?

這是我的模型:

var mg = require('mongoose') 
, S = mg.Schema; 

var subject = new S({ 
    name: String 
    , properties: [{ 
     name: String 
     , value: String 
    }] 
}); 

module.exports = mg.model('Subject',subject); 

當我嘗試添加一個屬性,它在某種程度上被轉化爲"[object Object]"

console.log(req.body); // --> { name: 'height', value: 120 } 
    console.log(typeof req.body); // --> object 
    ob.Subject.findByIdAndUpdate(req.params.id, {$push: {properties: req.body}}, function(err, doc) { 
    if(err) throw err; 
    res.send(doc); 
    }); 

返回doc是:

{_id: '...', name: 'sss', properties:[ "[object Object]" ]} 

我用mongo CLI檢查數據庫中的文檔,並輸入正確的值你在裏面。

//the document as seen in mongo CLI: 
{ 
    _id: '...', name: 'sss', 
    properties: [ "[object Object]", {name: "aaa", value: "bar"} ] 
} 

然後我嘗試這樣的:

ob.Subject.findById(id, function(err, doc) { 
    res.send(doc); 
} 

然後返回的文檔是:

{ 
    _id: '...', name: 'sss', 
    properties:[ "[object Object]", "[object Object]" ] 
} 

我認爲,正在發生的事情是貓鼬莫名其妙的子文檔轉換成此字符串。此外,我不認爲這是我的,還是res.send()故障原因:

  • 我不使用toJsontoObject明確,我不處理在所有
  • res.send() JSON的轉換不是問題因爲即使我util.inspect的價值 - 這是相同的
  • 無效的轉換似乎發生在兩種寫入和通過貓鼬

看你有沒有遇到過類似的行爲?有沒有辦法解決這個問題?

我剛開始使用貓鼬,並沒有一個想法如何備用到MongoDB本地更新和獲取文件,並檢查這種行爲是否仍然存在(我懷疑)。

任何有用的提示讚賞:)

+0

同樣在這裏。我發現,如果你將你的子文檔定義爲一個Schema,就像var subject = new S({0121} 然後它工作正常... 對我來說看起來不太正確,因爲我將它定義爲一個對象,因爲只需要一個實例(不是集合),並結束必須使用模式數組,因爲模式只能嵌套在Mongoose中,如果您將它們嵌入到數組中,您是否找到了更適當的解決方案? – Javo 2013-04-18 11:54:20

+0

'有沒有辦法解決?' - 是的,它被稱爲[bug報告](https://github.com/learnboost/mongoose/issues)。 – inf3rno 2014-09-05 02:44:54

回答

1

即使的Node.js和MongoDB都使用JavaScript它們不共享相同的內存空間。他們甚至沒有在同一個過程中運行。因此他們必須通過tcp進行通話並序列化數據。

我會假設你的req.body得到toString()'ed格式化請求mongoDB。

編輯

這是正常的,因爲你宣佈你的模型的properties屬性爲字符串數組。

只是聲明它是這樣的:

properties: Object  
+0

但是,當我使用CLI將合適的子文檔放在文檔中時發生同樣的事情,然後嘗試使用貓鼬讀取文檔。子文檔在CLI中看起來很正常。只有它的值纔會被轉換成'「[object Object]」''find'中的某處。 – nooga 2013-03-11 15:48:46

+0

編輯我的回覆 – Floby 2013-03-11 16:09:55

1

我覺得你的「屬性」屬性定義錯誤。我明白你正在嘗試做的,但我懷疑你需要定義鍵/值對作爲一種它自己的,這樣你的代碼就變成了:

var mg = require('mongoose') 
    , S = mg.Schema; 

    var keyValue = new S({ 
     key: String, value: String}); 

    var subject = new S({ 
     name: String 
     , properties: [keyValue] 
    }); 

    module.exports = mg.model('Subject',subject); 
0

你可以試試這個:

ob.Subject.findByIdAndUpdate(req.params.id, {$push: {properties: {name: req.body.name, value: req.body.value}}}, function(err, doc) { 
    if(err) throw err; 
    res.send(doc); 
}); 
相關問題