mongodb
ではありません 専門家ですが、私があなたを正しく理解していれば、サブドキュメントの_idフィールドが自動的に挿入されることを望みます。
threads
を作成しました dbそして最初のmessage
を挿入しました message
で 次のコマンドを使用したコレクション:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
_id:ObjectId()
に注意してください 分野。結果は次のとおりです。
これで、ObjectId(56...)
ができました。 、その特定のレコードを更新して、さらにメッセージを挿入できます。コマンドは次のとおりです。
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
そして、上記はコレクションに新しいメッセージを挿入します。以下のスクリーンショットを参照してください:
そして最後に、いくつかの更新の後、コレクションは次のようになります。
messages
のすべての_idフィールド 配列は自動的に生成されます。
_id
を使用するのは良い考えではないかもしれません さまざまな理由でフィールド。サブドキュメントのキーとして_idを使用するかどうかの詳細については、Googleにお問い合わせください。
MongoDBシェルバージョン3.0.6を使用しました コマンドのために。
編集28-01-201616:09
上記のソリューションはMongoDBシェルに基づいていたため、MongoDB用のNode.jsドライバーを使用して別のテストを行うことにしました。まず、ObjectID変数を次のように宣言します
var ObjectID = require('mongodb').ObjectID;
update
では、次のように、メッセージを挿入するスレッドのドキュメントIDとともにObjectIDを使用します。 およびfindOneAndUpdate
関数呼び出し
app.get('/insertNewMessage', function(req, res) {
db.collection("messages").findOneAndUpdate({
_id: new ObjectID('56aa3554e90911b64c36a424')
}, {
$push: {
messages: {
_id: new ObjectID(),
message: "From NodeJS with <3 using findOneAndUpdate.Bye."
}
}
}, function(err, result) {
if (err)
res.json(err);
else
res.json(result);
});
});
両方をテストし、問題なく動作します。以下のスクリーンショットを参照してください: