Если я правильно понял ваш вопрос, проблема связана с отсутствием оператора при методе обновления.
Когда вы используете что-то вроде:
Post.findByIdAndUpdate(
{ _id: req.params.id },
{
inviteGroup: invites // <-- Update statement
},
function(err, docs) {
//...
}
);
Это заменит полное значение поля inviteGroup
.
Чтобы добавить элемент в существующий массив в базе данных, вам нужно будет использовать $push
или $addToSet
* Оператор 1014 * вместе с оператором $each
.
Операторы $push
и $addToSet
, только добавить / добавить один элемент за раз, поэтому использование $each
необходимо для взаимодействия с каждым элементом, присутствующим в массиве invites
. В следующих примерах я включу это, потому что я верю, что вам нужно. Но, пожалуйста, не торопитесь, чтобы прочитать связанную документацию каждого оператора, чтобы вы могли найти больше примеров.
Оператор $push
добавляет указанное значение в массив, не делая дополнительной проверки если добавленное значение уже существует в поле или нет. Как:
//document on mongodb, before the update
// { _id : "1", inviteGroup : [] }
//Invites from the request
// invites = [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ];
//update method
Post.findByIdAndUpdate(
{ _id: req.params.id }, //req.params.id = "1"
{ $push : { inviteGroup: { $each : invites } } },
function(err, docs) {
//...
}
);
//document on mongodb, after the update
/*
{
_id : "1",
inviteGroup : [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ]
}
*/
При повторном вызове метода обновления с теми же значениями:
Post.findByIdAndUpdate(
{ _id: req.params.id }, //req.params.id = "1"
{ $push : { inviteGroup: { $each : invites } } },
function(err, docs) { }
);
// the end document will be like:
/*
{
_id : "1",
inviteGroup : [
{ bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"},
{ bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"}
]
}
*/
Таким же образом оператор $addToSet
добавляет оператор значение в массив, если только это значение не присутствует, в этом случае $addToSet
ничего не делает с этим массивом. Например:
//document on mongodb, before the update
// { _id : "1", inviteGroup : [] }
//Invites from the request
// invites = [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ];
//update method
Post.findByIdAndUpdate(
{ _id: req.params.id }, //req.params.id = "1"
{ $addToSet : { inviteGroup: { $each : invites } } },
function(err, docs) {
//...
}
);
//document on mongodb, after the update
/*
{
_id : "1",
inviteGroup : [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ]
}
*/
Если вы снова вызовете метод обновления с теми же значениями:
Post.findByIdAndUpdate(
{ _id: req.params.id }, //req.params.id = "1"
{ $addToSet : { inviteGroup: { $each : invites } } },
function(err, docs) { }
);
//the end document will be the same because the same value was already on the list:
/*
{
_id : "1",
inviteGroup : [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ]
}
*/
Что ж, я надеюсь, это было то, что вы искали. =]