Добавление массива ObjectIds - PullRequest
0 голосов
/ 10 января 2019

У меня есть массив ObjectIds в коллекции, и я хочу просто добавить ObjectId другой коллекции.

router.post('/add/child', (req, res) => {
    console.log(req.body);
    switch (req.body.type) {
        case "category":
            Category.findOne({_id: req.body.to})
            .then(category => {
                if (!category) {
                    res.json({error: req.body.type + " not found"});
                }
                category.update({$push: {words: req.body.child}});
                console.log('category', category);
                res.json({category});
            })
            .catch(err => {
                console.log(err);
                res.json(err.response)
            })
        default:
            break;
    }
}

Требуется:

{ type: 'category',
to: '5c312fd6ec0fff1c280aca19',
child: '5c323bed9b0f713aa0d49399' }

категория:

category { words: [],
    _id: 5c312fd6ec0fff1c280aca19,
    title: 'Weather',
    [__v: 0 }

Модель для категории:

category: {
    title: {
        type: String,
        required: true
    },
    variation: {
        type: String
    },
    words: [{
        type: Schema.Types.ObjectId,
        ref: "words"
    }]
},

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Чтобы добавить массив, вам нужен оператор $push в методе обновления, например findOneAndUpdate или findByIdAndUpdate. Если вы используете существующий метод, вам нужно вызвать метод push для самого массива, а затем save i.e.:

Category.findById(req.body.to).then(category => {
    if (!category) {
        res.json({error: req.body.type + " not found"});
    }
    category.words.push(req.body.child);
    return category.save();
}).then(updatedCategory => {
    console.log('updatedCategory', updatedCategory);
    res.json({ category: updatedCategory });
})

Лучший атомарный способ - использовать метод findOneAndUpdate, например:

Category.findByIdAndUpdate(req.body.to, 
    {'$push': {'words': req.body.child}},
    {new: true},
)
.exec()
.then(category => {
    console.log('category', category);
    if (!category) {
        res.json({error: req.body.type + " not found"});
    }
    res.json({ category });
})
.catch(err => {
    console.log(err);
    res.json(err.response)
})
0 голосов
/ 10 января 2019

Мне не очень понятно, что вы ищете. Но я полагаю, что вы пытаетесь получить результаты из двух сборников. $ lookup - лучший способ сделать это. Вы можете настроить свой результат, используя $ project .

db.category.aggregate([
   {
     $lookup:
       {
         from: "words",
         localField: "id_of_words",
         foreignField: "id_of_category", // Id of category & words should match.
         as: "docs"
       }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...