在嵌套数组MongoDB中更新或插入新数据

问题描述 投票:0回答:1

我正在将Node JS与Mongoose fyi一起使用。鉴于我有这样的事情:-

let people = [
    {
        "_id": 1,
        "name": "Person 1",
        "pets": [
            {
                "_id": 1,
                "name": "Tom",
                "category": "cat",
                "favFood": [
                    {
                        "_id": 1,
                        "name": "steamed fish"
                    }
                ]
            },
            {
                "_id": 2,
                "name": "Jerry",
                "category": "mouse",
                "favFood": [
                    {
                        "_id": 1,
                        "name": "cheese"
                    }
                ] 
            }
        ]
    }
]

现在我知道如何insert新的pet数据如下所示:-

// new Pet Data to INSERT
let newPetData = {
    name: "Butch",
    category: "dog",
    favFood: [
        {
            name: "bone"
        }
    ]    
}

// INSERT new data in DB
People.updateOne(
    // push into the sub-documents - pets
    { $push: { pets: newPetData } },
    (err, success) => {
        if(err) res.json({ message: `Unsuccessful!`, report: err })
        else res.json({ message: `Successful!`, report: success })
    }
)

但是如果我有favFood (宠物的ID)],我该如何插入pet的新id数据?

let petID = 1 // this is the ID of pet named Tom

// this is a new favorite food of Tom to INSERT
let newFavFood = {
    name: "fried fish"
}

// code to INSERT new favorite food of Tom (THIS DOES NOT WORK!)
People.updateOne(
    { "_id": petID } // id of pet 'Tom'
    { $push: { favFood: newFavFood } }, // push into the sub-documents - favFood
    (err, success) => {
        if(err) res.json({ message: `Unsuccessful!`, report: err })
        else res.json({ message: `Successful!`, report: success })
    }
)    

以上代码不起作用。我以为如果指定像上面id所示的宠物的{ "_id": petID },将产生我想要的东西。即使返回messageSuccessful!。但是仍然对db

本身未添加新记录。我要寻找的结果将是如下所示的内容:-
let people = [
    {
        "_id": 1,
        "name": "Person 1",
        "pets": [
            {
                "_id": 1,
                "name": "Tom",
                "category": "cat",
                "favFood": [
                    {
                        "_id": 1,
                        "name": "steamed fish"
                    },
                    {
                        "_id": 2, 
                        "name": "fried fish" // this is the new data inserted
                    }
                ]
            },
            {
                "_id": 2,
                "name": "Jerry",
                "category": "mouse",
                "favFood": [
                    {
                        "_id": 1,
                        "name": "cheese"
                    }
                ] 
            }
        ]
    }
]

还有其他方法可以做到这一点吗?我必须在其中实现$elemMatch吗?如果是这样,我该怎么办?

我正在将Node JS与Mongoose fyi一起使用。鉴于我有这样的事情:-let people = [{“ _id”:1,“ name”:“ Person 1”,“ pets”:[{“ _id”:1,...

arrays mongodb nested mongodb-query insert-update
1个回答
0
投票

查询部分匹配文档,而不匹配元素,因此{ "_id": petID }匹配该人的_id。要匹配宠物,请使用点分符号,例如{ "pets._id": petID }

© www.soinside.com 2019 - 2024. All rights reserved.