Javascript 如何在MongoDB中添加到此集合

Javascript 如何在MongoDB中添加到此集合,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,所以我有一个EmployeeSchema,它接收一个用户和一组员工。每个员工都有一封电子邮件、姓名、职务和一个问答数组。我希望能够添加到questionandanswer数组,但我不知道如何使用user.id和employee.email或employee.id查找集合。比如说,我想找到matt@concur.com并添加到问答数组中 { "_id": { "$oid": "5b7bb55197243619089d5a2f" }, "user": { "$oid": "5b7ae

所以我有一个EmployeeSchema,它接收一个用户和一组员工。每个员工都有一封电子邮件、姓名、职务和一个问答数组。我希望能够添加到questionandanswer数组,但我不知道如何使用user.id和employee.email或employee.id查找集合。比如说,我想找到matt@concur.com并添加到问答数组中

{
"_id": {
    "$oid": "5b7bb55197243619089d5a2f"
},
"user": {
    "$oid": "5b7aeb3cf0861f453c279910"
},
"employee": [
    {
        "_id": {
            "$oid": "5b7bb8893b55b9192cd84f58"
        },
        "email": "matt@concur.com",
        "name": "Matt J",
        "jobtitle": "HR Manager",
        "questionandanswer": []
    },
    {
        "questionandanswer": [],
        "_id": {
            "$oid": "5b7bb5db3b55b9192cd84f57"
        },
        "email": "john@concur.com",
        "name": "John Doe",
        "jobtitle": "Software Engineer"
    }
],
"__v": 2
}
这就是我的AddEmployee现在的样子:

const employeeFields = {};
employeeFields.user = req.user.id;
if (req.body.email) employeeFields.email = req.body.email;
if (req.body.name) employeeFields.name = req.body.name;
if (req.body.jobtitle) employeeFields.jobtitle = req.body.jobtitle;

Employee
    .findOne({
        user: req.user.id
    })
    .then(employee => {
        employee.employee.unshift(employeeFields);
        employee.save().then(employee => res.json(employee));
        //new Employee(employeeFields).save().then(employee => res.json(employee));
    })

您可以使用以下查询语法从employee数组中查找employee

db.Employee.findOne({ user.$oid : req.user.id, "employee" : { $elemMatch :{ email: req.body.email } } }, function(err, employee) {
   employee.questionandanswer.push(" your question and answer object from request ");
   employee.save();
});

试试这个,让我知道它是否有效。

根据您在问题中提到的内容,如果我理解错误,请纠正我。您正在尝试根据请求正文中的内容筛选数据:

从性能的角度来看,当您在一个简单的查询中查找和更新时,它会更好,这就是为什么我在这里使用
findOneAndUpdate

此外,我想强调的是,我注意到您将
employee
定义为
array
,这就是我使用
employee.0
employee.1
的原因,因此如果您将employee属性作为对象,您可以忽略
0
1

let employeeFields = {};
employeeFields["user.$oid"] = req.user.id;
if (req.body.email) employeeFields["employee.0.email"] = req.body.email;
if (req.body.name) employeeFields["employee.0.name"] = req.body.name;
if (req.body.jobtitle) employeeFields["employee.0.jobtitle"]  = req.body.jobtitle;

db.Employee.findOneAndUpdate( employeeFields , "$push": { "employee.1.questionandanswer": **your question and answer object**});
看一看,让我知道它是否有效,如果没有请留下评论,以了解您的问题,并能够更好地帮助您

更多帮助:

Raul,看一下MongoDB运营商$elemMatch