猫鼬通过多种条件过滤并执行以更新数据

时间:2020-07-17 07:06:40

标签: node.js mongodb mongoose

我想知道使用猫鼬制作架构函数的最佳方法是什么?我从未使用过它,所以我认为这种方式受到了一定限制,在不知道可用文档的情况下寻找文档的方法也不是很有效。

通过文档,我发现使用findOneAndUpdate可能会解决问题;但是有一些限制。

这是我计划运行的代码:

models / Bookmark.js

const mongoose = require('mongoose')

const bookmarkItemSchema = new mongoose.Schema({
    restaurantId: String,
    cachedAttr: {
        name: String,
        latitude: Number,
        longitude: Number,
    },
})

const bookmarkListSchema = new mongoose.Schema({
    listName: String,
    items: [bookmarkItemSchema],
})

const bookmarkSchema = new mongoose.Schema({
    userId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
    },
    lists: [bookmarkListSchema],
})

// const add = (lists, userId) => {
//     let bookmark = Bookmark.findOne({userId})
//     bookmark.lists.listName === lists.listName //current, new
//         ? bookmark.lists.items.push(lists.items)
//         : bookmark.lists.push(lists)
//     return bookmark
// }

mongoose.model('Bookmark', bookmarkSchema)

Routes / bookmark.js

router.post('/bookmarks', async (req, res) => {
    const {lists} = req.body
    console.log(lists)
    if (!lists) {
        return res.status(422).send({error: 'You must provide lists'})
    }

    let bookmark = Bookmark.findOne({"userId": req.user._id})
    if (bookmark.lists.listName === lists.listName){
        let item = lists.items
        bookmark.lists.items.push(item)
        await bookmark.save()
        res.send(bookmark)
    }

    try {
        // const bookmark = Bookmark.add(lists, req.user._id, obj)
        // await bookmark.save()
        // res.send(bookmark)
        let bookmark = Bookmark.findOne({"userId": req.user._id})
        if (bookmark.lists.listName === lists.listName){ // THIS IS UNDEFINED. How to get this object?
            let item = lists.items
            bookmark.lists.items.push(item)
            await bookmark.save()
            res.send(bookmark)
        }
    } catch (e) {
        res.status(422).send({error: e.message})
    }
})

需求主体如下:

{
  "lists": {
    "listName": "My Saved List",
    "items": {
      "restaurantId": "abcdefg",
      "cachedAttr": {
        "name": "abcdefg",
        "latitude": 200,
        "longitude": 200
      }
    }
  }
}

基本上,我在models / Bookmark.js文件中注释的是我真正想要做的。

如果userId的列表名称已经存在,那么我想将一个项目添加到列表中。 否则,我想向对象添加一个新列表。

执行此操作的最佳方法是什么?有没有可以直接用于此问题的猫鼬api?还是我需要制作两个单独的函数来处理每种情况,并将其作为模式方法并在路由文件中处理?

0 个答案:

没有答案