mongodb、express.js。ドキュメントの配列に新しいドキュメントを追加するセレクターはidです

Nov 26 2020

ドキュメントの配列に新しいドキュメントを追加したいと思います。そこで、追加したいドキュメントの_idであるパラメータを渡します。次に、それを配列に追加する必要があります。私はそれが機能していると思っていましたが、実際にはその配列にネストされた配列を追加していました。これは、新しく追加されたドキュメントが一番上になるように並べ替えようとしているためです。そのため、戻って追加クエリを修正する必要がありました。今のところ、基本的には値を追加できないと言っているだけです。これが、私がmongodbクライアントを使用している理由です。

私はmongodbのマニュアルを見て、それらが持っているものを試しましたが、それを機能させることができません。明らかに、新しいドキュメントの追加に問題があります。誰かが問題を見たり、例を見せてくれますか?ありがとう!

app.post("/addComment/:id", async (request, response) => {
    let mongoClient = new MongoClient(URL, { useUnifiedTopology: true });
    try {
        await mongoClient.connect(); 
        let id = new ObjectId(request.sanitize(request.params.id));

       
        request.body.comments = { $push: {"comments.author": "myTestPOSTMAN - 1", "comments.comment": "myTestCommPostMan - 1"}}; let selector = { "_id":id }; //let newValues = {$push: {"comments.comment": "myTestCommPostMan - 1", "comments.author": 
        "myTestPOSTMAN - 1"}};
        let newValues = request.body.comments;
        let result = await mongoClient.db(DB_NAME).collection("photos").updateOne(selector, 
        newValues);

        if (JSON.parse(result).n <= 0) {
            response.status(404);
            response.send({error: "No documents found with ID"});
            mongoClient.close();
            return;
        }
        response.status(200);
        response.send(result);     
    } catch (error) {
        response.status(500);
        response.send({error: error.message});
        throw error;
    } finally {
        mongoClient.close();
    }
});

post manを使用すると、これは私のjsonがどのように見えるか、そして私が追加しようとしているドキュメントの配列がどのように見えるかです。

 {"comments": [
                {
                    "comment": "pm - test3",
                    "author": "pm - test4"
                }
            ]
        }

回答

turivishal Nov 26 2020 at 21:42
  • 関数の外部でmongodb接続を実行します。関数呼び出しのたびに接続および切断する必要はなく、異常な変数を作成しすぎないでください。
  • プッシュオブジェクトの場合、メインキー名を指定し、それにオブジェクトを割り当てる必要があります。
let mongoClient = new MongoClient(URL, { useUnifiedTopology: true });
await mongoClient.connect();
app.post("/addComment/:id", async (request, response) => {

    try {

        let result = await mongoClient.db(DB_NAME).collection("photos").updateOne(
            { "_id": new ObjectId(request.sanitize(request.params.id)) }, 
            { $push: { comments: request.body.comments } }
        );
        if (JSON.parse(result).n <= 0) {
            response.status(404).send({ error: "No documents found with ID" });
            return;
        }
        response.status(200).send(result);

    } catch (error) {
        response.status(500).send({ error: error.message });
    }

});