sql >> データベース >  >> NoSQL >> MongoDB

mongoDB:配列フィールドに追加された新しい子ごとにObjectIdを作成する

    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);
        });
    });
    

    両方をテストし、問題なく動作します。以下のスクリーンショットを参照してください:



    1. IngressNginxコントローラーでRedisを公開する

    2. Laravelでキャッシュファサードを使用しているときにRedisキーが表示されない

    3. insert()、insertOne()、insertMany()メソッドの違いは何ですか?

    4. MongoDB-管理者ユーザーが許可されていません