附加的ObjectId数组

时间:2019-01-10 03:47:12

标签: node.js mongodb mongoose mongodb-query

我在一个集合中有一个ObjectId数组,我想简单地添加另一个集合的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 :(得分:1)

要追加数组,您需要在$pushfindOneAndUpdate之类的更新方法中使用 findByIdAndUpdate 运算符。如果您使用的是现有方法,则需要先对数组本身调用push方法,然后再调用save,即:

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)
})

答案 1 :(得分:0)

我不清楚您要寻找什么。但是,我相信您正在尝试从两个集合中获取结果。 $lookup是最好的方法。您可以使用$project自定义结果。

db.category.aggregate([
   {
     $lookup:
       {
         from: "words",
         localField: "id_of_words",
         foreignField: "id_of_category", // Id of category & words should match.
         as: "docs"
       }
  }
])