Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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删除整个文档,而不是从嵌套数组中删除元素_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript Mongoose删除整个文档,而不是从嵌套数组中删除元素

Javascript Mongoose删除整个文档,而不是从嵌套数组中删除元素,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我有这样的结构: { name : 'name1' projects : [ {projectId : 123 , ...more}, {projectId : 124 , ...more}, {projectId : 125 , ...more}, ] } { name : 'name2' projects : [ {projectId : 126 , ...} {projectI

我有这样的结构:

{
    name : 'name1'
    projects : [
      {projectId : 123 , ...more},
      {projectId : 124 , ...more},
      {projectId : 125 , ...more},
    ]
  }
  
  {
    name : 'name2'
    projects : [
      {projectId : 126 , ...}
      {projectId : 127 , ...}
    ]
  }
要查找基于projectId的单个条目,我使用以下代码:

   const project = await ClientManager.findOne({
  project: {$elemMatch: { projectId: projectId } },
}, {'project.$': 1});
这很有效。但是现在我想从projects数组中删除一个项目,而不仅仅是查找文档

我尝试在末尾添加删除,但这会删除我的整个文档。我只想从projects数组中删除与给定projectId匹配的单个项目:

const project = await ClientManager.findOne(
  {
    project: { $elemMatch: { projectId: projectId } },
  },
  { 'project.$': 1 }
).remove();

要从项目数组中删除单个项,可以使用$pull

await ClientManager.findOneAndUpdate(
  { "projects.projectId": projectId },
  { $pull: { projects: {projectId: projectId} } }
);
此外,您不需要使用$elemMatch来查找文档,因为您只需要检查单个字段,即projectId。您可以改为执行此查询

const project = await ClientManager.findOne({
  "projects.projectId": projectId
}, {"project.$": 1});

要从项目数组中删除单个项,可以使用$pull

await ClientManager.findOneAndUpdate(
  { "projects.projectId": projectId },
  { $pull: { projects: {projectId: projectId} } }
);
此外,您不需要使用$elemMatch来查找文档,因为您只需要检查单个字段,即projectId。您可以改为执行此查询

const project = await ClientManager.findOne({
  "projects.projectId": projectId
}, {"project.$": 1});

您的解决方案删除了整个集合,包括名称etcI。您是否只想从该项目数组中删除项而不是文档?请允许我编辑我的回答和问题,因为您提到它删除的是整个集合,但不正确。您的解决方案删除了整个集合,包括名称etcI。您是否想删除只是从项目数组中删除项而不是文档?让我编辑我的答案和问题,因为您提到它删除的是整个集合,这是不正确的