У меня проблема с обновлением моего UserModel
субдокумента, который (OfferModel)
const user = Schema({
name: String,
offers: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Offer'
}]
});
const offer = Schema({
title: String,
post: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Post'
},
buyer: {
deal: String,
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
},
seller: {
deal: String,
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}
}
});
Так вот, у меня есть пользователь, у которого есть 3 предложения на 1 пост, но в общей сложности 10предложений в целом
Post A = 3 offers.
Post B = 7 offers.
Тогда я принял одно предложение на пост A, поэтому я запрашиваю базу данных и устанавливаю для свойства "deal" в разделе "customer" значение "ok", проблем неттот.Теперь мне нужно установить «отклонено» для других 2 предложений на Пост А. Есть решение для этого, если я сделаю Javascript следующим образом:
- Получите Идентификатор Поста
- Заполнитепредложения в соответствии с моделью пользователя, используйте оператор сопоставления, чтобы получать предложения только на конкретное сообщение, и это не было подтверждено (то есть 2 предложения)
- перебирать их и просто назначать
user.offers.buyer.deal = "rejected"
- Save ()
С этим подходом все в порядке, но я хочу сделать это мангустическим способом, я просто хочу знать, как я могу сделать это мангустическим способом?
IЯ также проверил оператор .update()
, но я не могу заставить его работать должным образом, или это не то, что мне нужно.
Любые сведения о том, как я могу обновить эти 2 предложения, используя только Mongoose.операторы?
Спасибо
** Обновление
const user = await this.userRepo.findUser(req.user._id)
.select('offers')
.populate({
path: 'offers',
match: {
post: req.body.postId,
'buyer.feedback': 'none'
}
})
.update({}, {
'$set': {
'offers.$.buyer.feedback': 'ok'
}
});
Ошибка CastError : Cast to ObjectId failed for value "ok" at path "offers"
*** Обновление 2 Примеры документов **** Обновление3 до и после
// John
{
"_id": ObjectId("5abf3c2fb9709a31244ee2a8"),
"name": "john",
"offers": [
ObjectId("5ad2aac1b0ef21131439223c"), // Offer that i accepted
ObjectId("5ad2ab39b0ef21131439223d"), // Offer i should reject
ObjectId("5ad2b9b2751c39321c4173e4"), // Offer i should reject
ObjectId("5ad2d0846778d91eb0b109a8"),
ObjectId("5ad2d136e50e903240cdb4b9"),
ObjectId("5ad2d14ae50e903240cdb4ba"),
ObjectId("5ad2d2acde95b51e205b26fc"),
ObjectId("5ad9cbaec9c10314148adcd8"),
ObjectId("5ad9ccf60c7f492940d4bd9d"),
ObjectId("5ad9cd2e0c7f492940d4bd9e"),
],
"post": [
ObjectId("5abf4eb433063a3ebc8ba78f"), // Post A
ObjectId("5abf4ec533063a3ebc8ba790"),
]
};
// Offer that i accepted
{
"_id" : ObjectId("5ad2aac1b0ef21131439223c"),
"buyer" : {
"deal" : "ok",
"feedback" : "none",
"user" : ObjectId("5abf3c2fb9709a31244ee2a8")
},
"seller" : {
"deal" : "none",
"feedback" : "none",
"user" : ObjectId("5abf3c2fb9709a31244ee8bf")
},
"post" : ObjectId("5abf4eb433063a3ebc8ba78f"),
}
// (BEFORE) Offer that i should reject
[{
"_id" : ObjectId("5ad2ab39b0ef21131439223d"),
"buyer" : {
"deal" : "none",
"feedback" : "none",
"user" : ObjectId("5abf3c2fb9709a31244ee2a8")
},
"seller" : {
"deal" : "none",
"feedback" : "none",
"user" : ObjectId("5abf3c2fb9709a31244ee8bd")
},
"post" : ObjectId("5abf4eb433063a3ebc8ba78f"),
},
{
"_id": ObjectId("5ad2b9b2751c39321c4173e4"),
"buyer": {
"deal": "none",
"feedback": "none",
"user": ObjectId("5abf3c2fb9709a31244ee2a8")
},
"seller": {
"deal": "none",
"feedback": "none",
"user": ObjectId("5abf3c2fb9709a31244ee8aa")
},
"post": ObjectId("5abf4eb433063a3ebc8ba78f"),
}]
// (AFTER)
[{
"_id": ObjectId("5ad2ab39b0ef21131439223d"),
"buyer": {
"deal": "rejected",
"feedback": "none",
"user": ObjectId("5abf3c2fb9709a31244ee2a8")
},
"seller": {
"deal": "none",
"feedback": "none",
"user": ObjectId("5abf3c2fb9709a31244ee8bd")
},
"post": ObjectId("5abf4eb433063a3ebc8ba78f"),
},
{
"_id": ObjectId("5ad2b9b2751c39321c4173e4"),
"buyer": {
"deal": "rejected",
"feedback": "none",
"user": ObjectId("5abf3c2fb9709a31244ee2a8")
},
"seller": {
"deal": "none",
"feedback": "none",
"user": ObjectId("5abf3c2fb9709a31244ee8aa")
},
"post": ObjectId("5abf4eb433063a3ebc8ba78f"),
}]