Мангуста заполняет поддок с условием и обновляет те - PullRequest
0 голосов
/ 19 мая 2018

У меня проблема с обновлением моего 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 следующим образом:

  1. Получите Идентификатор Поста
  2. Заполнитепредложения в соответствии с моделью пользователя, используйте оператор сопоставления, чтобы получать предложения только на конкретное сообщение, и это не было подтверждено (то есть 2 предложения)
  3. перебирать их и просто назначать user.offers.buyer.deal = "rejected"
  4. 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"),
  }]

1 Ответ

0 голосов
/ 19 мая 2018

вы должны попробовать что-то вроде этого

Offers.update({
  "buyer.feedback": "none",  
  post: req.body.postId      //query
}, {
  '$set': {
    'buyer.feedback': 'ok'    // update operation
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...