Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose-Model.deleteOne()正在删除整个集合,而不是单个文档_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript Mongoose-Model.deleteOne()正在删除整个集合,而不是单个文档

Javascript Mongoose-Model.deleteOne()正在删除整个集合,而不是单个文档,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我有一个包含一系列客户的用户模型。我想根据客户id删除特定客户。根据我在Mongoose文档中读到的内容,我应该使用Model.deleteOne删除单个文档 这是我的尝试 用户模式(为简洁起见,已缩短): 以下是路线和控制器: const express = require('express'); const router = express.Router(); const customer_controller = require('../../controllers/customers'

我有一个包含一系列客户的用户模型。我想根据
客户id
删除特定客户。根据我在Mongoose文档中读到的内容,我应该使用
Model.deleteOne
删除单个文档

这是我的尝试

用户模式(为简洁起见,已缩短):

以下是路线和控制器:

const express = require('express');
const router = express.Router();

const customer_controller = require('../../controllers/customers');

router.delete('/customers/:custid', customer_controller.customer_remove);

  module.exports = router;
exports.customer_remove = (req, res) => {
    const { params } = req;
    const { custid } = params;

    User.deleteOne({ 'customer._id': custid }, (err) => {
        if (err)
            throw err;
        else 
            console.log(custid, 'is deleted');
    });
};
最后,控制器:

const express = require('express');
const router = express.Router();

const customer_controller = require('../../controllers/customers');

router.delete('/customers/:custid', customer_controller.customer_remove);

  module.exports = router;
exports.customer_remove = (req, res) => {
    const { params } = req;
    const { custid } = params;

    User.deleteOne({ 'customer._id': custid }, (err) => {
        if (err)
            throw err;
        else 
            console.log(custid, 'is deleted');
    });
};

根据我的想法,
User.deleteOne({'customer.id':custid})
将找到与通过
req.params
传入的
custid
匹配的
custid
。当我在Postman中测试此路由时,它会删除客户所在的整个
User
集合,而不仅仅是删除客户。我能在正确的方向上轻推一下吗?我觉得我离这里很近(或者不是lol)。

deleteOne
在文档级别运行,因此您的代码将删除第一个
用户
文档,该文档包含一个
客户
元素和一个匹配的
\U id

相反,您希望使用更新用户文档以从
customer
数组字段中删除特定元素。要从所有用户中删除客户,请执行以下操作:

User.updateMany({}, { $pull: { customer: { _id: custid } } }, (err) => { ...

使用Mongoose,您可以执行以下操作:

 model.findOneAndUpdate({ 'customer._id': custid }, {$pull: { $pull: { 
 customer: { _id: custid } }}, {new: true}).lean();
删除子文档

默认情况下,每个子文档都有一个_id。Mongoose文档数组有一种特殊的id方法,用于搜索文档数组以查找具有给定id的文档

访问:


parent.children.id(_id).remove()

谢谢大家!!看起来我还误解了文档和元素的确切含义。在回调参数中,我尝试按如下方式返回用户(err,user)=>{能够按照我的需要实现和工作。如果您不介意,我还有一个问题。在回调中,我尝试按如下方式返回用户:
(err,user)=>{res send(user)}
并确实返回了数据,但它不是用户集合。在我的更新路由中,我能够在
Model.update()
的回调中返回
user
。这对
Model.updateMany()有不同的做法吗
?@maison.m既不
update
也不
updateMany
向回调提供更新的文档。如果需要该功能,请参阅
findOneAndUpdate