5

私はmongodbとmongooseを使用するnode.jsでAPIを構築しています。現在、データベースに永続化されていない埋め込みドキュメント(スキーマ内のスキーマ)内に埋め込みドキュメントがあり、できる限りのことを試しましたが、運がありませんでした。

私はスキーマをマングースで次のように定義しています:

var BlogPostSchema = new Schema({
  creationTime: { type: Date, default: Date.now },
  author: { type: ObjectId, ref: "User" },
  title: { type: String },
  body: { type: String },
  comments: [CommentSchema]
});

var CommentSchema = new Schema({
  creationTime: { type: Date, default: Date.now },
  user: { type: ObjectId, ref: "User" },
  body: { type: String, default: "" },
  subComments: [SubCommentSchema]
});

var SubCommentSchema = new Schema({
  creationTime: { type: Date, default: Date.now },
  user: { type: ObjectId, ref: "User" },
  body: { type: String, default: "" }
});

そして、私が実行するコードは次のとおりです。

// Create a comment
app.post("/posts/:id/comments", function(req, res, next) {
  Posts.find({ _id : req.params.id }, function(err, item){
    if(err) return next("Error finding blog post.");                
    item[0].comments.push(new Comment(JSON.parse(req.body)));
    item[0].save(); // <= This actually saves and works fine
    respond(req, res, item[0].comments, next);
  });
});

// Create a subcomment
app.post("/posts/:id/comments/:commentid/subcomments", function(req, res, next) {
  Posts.find({ _id : req.params.id }, function(err, item){
    if(err) return next("Error finding blog post.");
    item[0].comments[req.params.commentid - 1].subcomments.push(new SubComment(JSON.parse(req.body)));
    item[0].save(); // <= This completes (without error btw) but does not persist to the database
    respond(req, res, item[0].comments[req.params.commentid - 1].subcomments, next);
  });
});

コメント付きのブログ投稿は問題なく作成できますが、何らかの理由でコメントにサブコメントを作成できません。ブログ投稿ドキュメントには、実行中にコンソールに印刷するときに実際にコメントとサブコメントが添付されています。データベースには保存されません(ブログ投稿はコメント付きで保存されますが、サブコメントは保存されません)。

コメント配列で「markModified」を試みましたが、変更はありません。

Posts.markModified("comments"); // <= no error, but also no change
...
Posts.comments.markModified("subcomments"); // <= produces an error: "TypeError: Object [object Object] has no method 'markModified'"
4

2 に答える 2

7

解決してからの問題。私はマングースのグーグルグループでアーロンヘックマンから答えを与えられました:

親スキーマに渡す前に、必ず子スキーマを宣言してください。そうしないと、未定義が渡されます。

SubCommentSchemaが最初で、次にComment、BlogPostの順になります。

スキーマを逆にした後、それは機能しました。

于 2012-05-02T20:46:25.390 に答える
1

埋め込まれたドキュメントも完全にあらゆるサービスに対応しているため、ドキュメントの更新は重要な問題ではないと思います。

于 2012-05-02T05:39:49.147 に答える