MongoDB $ addToSet для глубоко вложенного массива объекта - PullRequest
0 голосов
/ 12 сентября 2018

Ниже моя структура данных.

{
    "_id" : "room1",
    "members" : [ 
        {
            "_id" : "member1",
            "name" : "Michael",
            "payments" : [
                {
                    "month": "2018/09"
                    "amount": "20"
                }
            ]
        }, 
    ]
}

Я хочу подтолкнуть объект под Майкла payments

{ 
  "month": "2018/09", 
  "amount": "5000" 
}

В этом случае я хочу перезаписать объект, потому что month: "2018/09" уже существует. Как ниже:

{
    "_id" : "room1",
    "members" : [ 
        {
            "_id" : "member1",
            "name" : "Michale",
            "payments" : [
                {
                    "month": "2018/09"
                    "amount": "5000"
                }
            ]
        }, 
    ]
}

И, в случае, когда я хочу подтолкнуть объект, который не существует, тот же month в платежах, я хочу добавить этот объект в payments.

{ 
  "month": "2018/10", 
  "amount": "2000" 
}

Итак, ожидаемый результат

{
    "_id" : "room1",
    "members" : [ 
        {
            "_id" : "member1",
            "payments" : [
                {
                    "month": "2018/09"
                    "amount": "5000"
                },
                {
                    "month": "2018/10"
                    "amount": "2000"
                }
            ]
        }, 
    ]
}

Я попробовал, как показано ниже, но это не работает. Мой код генерирует дублированный новый month объект каждый раз, когда я пытаюсь. Как я могу сделать это правильно?

Rooms.update(
    {
        _id: "room1",
        "members._id": "member1",
        "members.$.payments": {
            $not: {
                $elemMatch: {
                    month: req.body.month
                }
            }
        }
    },
    {
        $addToSet: {
            "members.$.payments": {
                month: req.body.month,
                amount: req.body.value
            }
        }
    },
    { multi: true }, function (err, result) {
        console.log(result)
    }
)

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Итак, я слышал, что сам должен определить дублирование, поэтому ниже мой код ... сейчас он пишет. ,,


Итак, наконец, это мой код

  Clubs.findOne({ 
        uid: req.params.club_id,
        "members._id": mongoose.Types.ObjectId(req.params.member_uid)
    }, function(err, club){

        let member = club.members.filter(el => {
            if(el._id.equals(req.params.member_uid)) return el
        })

        let duplicated = false; 
        member[0].payments.map(el => {
            if(el.month === req.body.month) duplicated = true
        })

       if(duplicated){

        Clubs.update(
            {
                uid: req.params.club_id,
                "members._id": mongoose.Types.ObjectId(req.params.member_uid),
            },
            {
                $set: {
                    ["members.$.payments."+index+".amount"] : req.body.value
                }
            },
            function (err, result, third) {
                if (err) throw err
                console.log('result')
                console.log(result)
                res.json({})
            }
        )


    } else {

        Clubs.update(
            {
                uid: req.params.club_id,
                "members._id": mongoose.Types.ObjectId(req.params.member_uid),
            },
            {
                $push: {
                    "members.$.payments" : { 
                        month : req.body.month, 
                        amount: req.body.value 
                    }
                }
            },
            function (err, result, third) {
                if (err) throw err
                console.log('result')
                console.log(result)
                res.json({})
            }
        )
    }

    })
0 голосов
/ 14 сентября 2018

Возможно, рассмотрите возможность изменения структуры вашего вложенного массива на объект ?Поэтому измените это

{
  "payments": [{
      "month": "2018/09"
      "amount": "5000"
    },
    {
      "month": "2018/10"
      "amount": "2000"
    }
  ]
}

на следующее:

{
  "payments": {
    "2018/09": "5000",
    "2018/10": "2000"
  }
}

Тогда вы можете сделать простое обновление:

Rooms.update({
    _id: "room1",
    "members._id": "member1",
    "members.payments": {
      $exists: true
    }
  }, {
    $set: {
      "members.payments." + req.body.month: req.body.value
    }
  },

)
0 голосов
/ 12 сентября 2018

Вы можете использовать приведенную ниже команду, чтобы добавить без двуличия в месяцах или сумме

Rooms.update(
    {
        _id: "room1",
        "members._id": "member1"
    },
    {
        $addToSet: {
            "members.$.payments": {
                month: req.body.month,
                amount: req.body.value
            }
        }
    },function (err, result) {
        console.log(result)
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...