3

埋め込まれたドキュメントで奇妙な動作に遭遇しました。何か間違ったことをしたのか、それともバグなのかわかりません。

これは私のモデルです:

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()さらに、これが私のせいだとは思いません。

  • toJsonまたは明示的に使用してtoObjectいません。JSON 変換はまったく処理しません。
  • res.send()util.inspect値であっても同じであるため、問題ではありません
  • マングース経由の書き込みと読み取りの両方で無効な変換が発生するようです

同様の動作に遭遇したことがありますか? それを回避する方法はありますか?

私はmongooseを使い始めたばかりで、mongodbネイティブにフォールバックしてドキュメントを更新およびフェッチし、この動作が持続するかどうかを確認する方法がわかりません(疑わしい)。

役立つヒントをいただければ幸いです:)

4

3 に答える 3

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);
于 2013-03-11T16:10:58.317 に答える
1

Node.js と MongoDB はどちらも Javascript を使用していますが、同じメモリ空間を共有していません。それらは同じプロセスで実行されていません。したがって、tcp を介して通信し、データをシリアル化する必要があります。

mongoDBのリクエストをフォーマットするときに、あなたreq.bodyが「ed」になっていると思います。toString()

編集

propertiesモデルの属性を文字列の配列として宣言したため、これは正常です。

次のように宣言するだけです。

properties: Object    
于 2013-03-11T15:32:24.847 に答える
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);
});
于 2013-03-11T18:12:38.650 に答える