从mongodb中的嵌套文档数组中删除单个记录

时间:2019-08-22 13:40:50

标签: node.js mongodb

我只想从特定用户的联系人数组中删除一个联系人 使用nodejs从mongdb中动态

    {
    _id:ObjectId("532737785878v7676747788"),
    firstname:"Mark",
    lastname:"Anthony",
    email:"xyz@gmail.com",
    contacts:[
   {
    _id:ObjectId("678758478fr7889889)",
    firstName:"James",
    lastName:"Cole",
    phoneNo:"09746"
   },
  {
    _id:ObjectId("678758478fr7889889)"
    firstName:"Jane"
    lastName:"Doe"
    phoneNo:"12345"
   }
]
    }

我尝试过:

       User.updateOne(
       {email:'xyz@gmail.com', 'contacts._id':678758478fr7889889},
       { $pull : { contacts : { firstName:'Jane', lastName:'Doe',  phoneNo:'12345'} } },
       {multi:true},
       );

我没有收到任何错误消息,也没有删除任何联系人

2 个答案:

答案 0 :(得分:0)

猫鼬会在写时使用已定义的架构在DB中创建ObjectId,但不会在_id(ObjectId's)上使用架构进行查找查询,因此,您必须明确地说_id是ObjectId()。请在您的代码中输入:

const mongoose = require('mongoose'); // Ignore this if you've already imported.
const ObjectId = mongoose.Types.ObjectId;

// Assuming id is the value you've got in request.
User.updateOne(
   {email:'xyz@gmail.com', 'contacts._id':new ObjectId(id)},
   { $pull : { contacts : { firstName:'Jane', lastName:'Doe',  phoneNo:'12345'} } });


// you can do the same with `findOneAndUpdate` with options {new: true} which would return updated document, by default it would be false that meant to return old document.
User.findOneAndUpdate(
       {email:'xyz@gmail.com', 'contacts._id':new ObjectId(id)},
       { $pull : { contacts : { firstName:'Jane', lastName:'Doe',  phoneNo:'12345'} } }, {new : true});

答案 1 :(得分:0)

db.collection.update({
        email:'xyz@gmail.com',
        contacts: {
            $elemMatch: {
                "_id": "678758478fr7889889"
            }
        }
    }, {
        $pull: {
            contacts: {
                _id: '678758478fr7889889'
            }
        }
    }

)
相关问题