簡體   English   中英

如果項目不存在,則將項目添加到數組 mongodb

[英]add item to array if it doesn't exist mongodb

我正在使用mongoDB + nodejs運行一個簡單的應用程序,我正在嘗試實現以下目標:

單位屬於公司教室屬於單位用戶屬於教室

在某個時刻,我想將用戶添加到另一個單元或/和教室,然后他將屬於 2 個或更多單元/教室。

我的表格每次只發送一個單元/教室,在這種情況下,我想將其添加到用戶 model unit:[string]classroom:[string] ],前提是他以前不屬於它。 所以我需要檢查arrays是否已經有發送的數據,如果沒有,添加它。

Mongo 有$addToSet屬性和$ne來做這件事,但我似乎無法讓它工作。

這是我的代碼:

User.findById(req.body._id)
    .select("-__v")
    .exec((err: Error, user: any) => {
            if (err) {
                // display error
            }
            if (!user) {
                // display error
            }
            user.update({
                unit: {
                    $ne: user.unit
                },
                classroom: {
                    $ne: user.classroom
                }
            }, {
                $addToSet: {
                    unit: req.body.unit,
                    classroom: req.body.classroom
                }
            }).exec((err: Error) => {
                if (err) {
                    // Display error
                }

                res.status(200).json({
                    status: "OK",
                    response: response,
                })
                return
            })

在此處輸入圖像描述

它屬於“Academy one”和classic id reference,我會將他添加到“Academy 2”這樣的另一個單元並添加另一個教室引用,但是如果我將他添加到“Academy One”的另一個教室,我不想要其單位數組中的重復項。

當我通過postman發布以下內容時,它給了我錯誤:

{
"_id":"5d8ba151248ecb4df8803657", // user id
"unit":"Test", // another unit
"classroom":"5d8a709f44f55e4a785e2c50" // another classroom
}

回復:

{ "status": "NOK", "response": "Cast to [string] failed for value \"[{\"$ne\":[\"Academy One\"]}]\" at path \"unit \"" }

我錯過了什么?

實際上,我不需要$ne運算符,我只需要直接使用$addToSet

user.updateOne({
  $addToSet: { unit: req.body.unit, classroom: req.body.classroom }
}).exec((err: Error) => {

謝謝!

您需要使用$nin而不是$nehttps://docs.mongodb.com/manual/reference/operator/query/nin/

unit: {$nin: [user.unit]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM