如何用猫鼬创建和更新参考文档?

时间:2020-10-03 19:52:46

标签: node.js mongodb mongoose

我有此设置

var NotesSchema = new mongoose.Schema({
    title: String,
    category: [{  type: mongoose.ObjectId, ref: "Categories", default: [] }],
},{ timestamps: { createdAt: 'created_at' } });
var CategoriesSchema = new Schema({
    name: {type: String, required: true}
})

var Notes = mongoose.model('Notes', NotesSchema);
var Cat = mongoose.model('Categories', CategoriesSchema);

如果我想创建新的笔记和类别,我会这样做

.get('/new', async (req, res) => {
    var post1=  {
        title : "Post: books, thriller, crime and classics",      
        favorite : true,
        categories:[ 'thriller', 'books']
    } 
    try{ 
        var note = post1.categories.map(  (cat)=>{
            var ca = new Cat({name: cat})
            ca.save()
            return ca._id
        })
        post1.category = note 
        const newNote = new Notes(post1);
        const n = await newNote.save()
        res.send(n)
    } catch(error) {
        console.error(error);
    }; 
})

如果我要创建一个包含一些新类别的新笔记,则会卡住。

var post1=  {
       ...
        categories:[ 'thriller', 'books', 'classics']
    }

“惊悚”和“书籍”已经存在,但“经典”不存在。

我尝试过Cat.find({"name": {$in: post1.categories}}).exec(),但似乎无法浏览这些数据。

所有示例教程似乎一次只添加一个新条目。

1 个答案:

答案 0 :(得分:0)

在您的post1.categories.map回调中,您正在创建Cat文档并对其调用save(),但是您不等待返回的诺言。因此Note是在兑现这些承诺之前创建的,因此post1.category将是一个空数组。

您可以通过等待类别的保存承诺来解决此问题:

const savePromises = post1.categories.map((cat) => {
    const ca = new Cat({name: cat})
    return ca.save();
})

const categoryIds = (await Promise.all(savePromises)).map(category => category._id);

post1.category = categoryIds;
// rest of your code