我遇到了嵌入式文档的奇怪行为,我不知道我是做错了还是错误。
这是我的模特:
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]" ]
}
我认为,正在发生的事情是mongoose以某种方式将子文档转换为此字符串。而且,我不认为这是我的,或res.send()
错误,因为:
toJson
或toObject
,我根本不处理JSON转换res.send()
不是问题,因为即使我util.inspect
价值 - 它也是一样的你有没有遇到类似的行为?有办法吗?
我刚开始使用mongoose并且不知道如何回退到mongodb native以更新和获取文档并检查这种行为是否仍然存在(我怀疑)。
任何有用的提示赞赏:)
答案 0 :(得分:1)
尽管Node.js和MongoDB都使用Javascript,但它们不共享相同的内存空间。他们甚至没有在同一个过程中运行。 因此,他们必须讨论tcp和序列化数据。
我认为在格式化mongoDB请求时,req.body
正在获得toString()
。
修改的
这是正常的,因为您将模型的properties
属性声明为字符串数组。
只需声明如下:
properties: Object
答案 1 :(得分: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);
答案 2 :(得分: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);
});