Я нашел решение!
99% кредита идет на Neil Lunn
за этот ответ: { ссылка }
Это привело меня на правильный путь , Я отказался от метода findOneAndUpdate
в пользу метода updateOne
. Параметры запроса et c. все осталось прежним, изменилось только имя метода и, очевидно, тип результата этого метода.
Проблема метода updateOne
заключается в том, что он не возвращает объект, который был обновлен (или старый). Но он возвращает upsertedId
, который является единственным, что мне нужно в моей ситуации.
Итак, в итоге вы получаете очень длинный CommandResult
объект, который начинается с:
CommandResult {
result: { n: 1, nModified: 0, ok: 1 },
(...)
}
, но когда я посмотрел очень внимательно, я заметил, что у объекта есть именно те поля, которые Мне понадобилось все время:
modifiedCount: 0,
upsertedId: null, // if object was inserted, this field will contain it's ID
upsertedCount: 0,
matchedCount: 1
Так что вам нужно просто взять нужные детали из объекта CommandResult
и просто продолжить;)
Мой код после изменения:
async function like(articleId, userId) {
const db = await makeDb();
return new Promise((resolve, reject) => {
db.collection(collectionName)
.updateOne(
{ articleId: ObjectID(articleId) },
{
$setOnInsert: {
articleId: ObjectID(articleId),
creationDate: new Date()
},
$addToSet: { likes: ObjectID(userId) }
},
{ upsert: true }
)
.then(data => {
// wrap the content that You need
const result = {
upsertedId: data.upsertedId,
upsertedCount: data.upsertedCount,
modifiedCount: data.modifiedCount
};
resolve(result);
});
});
}
Надеюсь, этот ответ поможет кому-то с подобной проблемой в будущем :)