Mongo / Mongoose — помещает объект в массив свойств документа при условии

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #mongoose

Вопрос:

У меня есть документ, хранящийся в mongo, который, среди прочего, содержит тип свойства массива с кучей объектов внутри. Я пытаюсь поместить объект в этот массив. Однако каждый объект, который помещается в массив, содержит объект date. Мне нужно, чтобы это работало, если объект с этой датой уже существует, тогда не помещайте новый объект в массив.

Я некоторое время играл с ним, пытаясь запустить запросы update и elemMatch и т. Д., Но я не могу понять это. У меня есть длинная версия ниже, как вы можете видеть, я делаю 2 отдельных запроса к базе данных, может кто-нибудь помочь мне свести это к чему-то более простому?

  UserModel.findById(req.user._id, (err, doc) => {
        if (err) {
            return res.sendStatus(401);
        }
        const dateExists = doc.entries.find((entry) => entry.date === date);
        if (dateExists) {
            res.sendStatus(401);
        } else {
            UserModel.findByIdAndUpdate(
                req.user._id,
                {
                    $push: {
                        entries: {
                            date,
                            memo,
                        },
                    },
                },
                { safe: true, upsert: true, new: true },
                (err, doc) => (err ? res.sendStatus(401) : res.sendStatus(200))
            );
        }
    });
 

Спасибо.

Ответ №1:

 db.users.updateOne({
  _id: req.user._id,
  "entries.date": date,
},
{
    $push: {
         entries: {date,memo},
    }
})
 

https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/index.html