Node.js mongo中删除数组元素的$pull请求

Node.js mongo中删除数组元素的$pull请求,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我有一个node和mongo应用程序,允许用户注册竞赛活动并发布对这些活动的订阅。 正如您在下面的mongo文件中所看到的,每个子项都属于一个事件: const mongoose = require('mongoose') mongoose.connect('mongodb://localhost:27017/CompetitionEvent') export const CompetitionSchema = new mongoose.Schema({ event_id: String

我有一个node和mongo应用程序,允许用户注册竞赛活动并发布对这些活动的订阅。
正如您在下面的mongo文件中所看到的,每个子项都属于一个事件:

const mongoose = require('mongoose')

mongoose.connect('mongodb://localhost:27017/CompetitionEvent')

export const CompetitionSchema = new mongoose.Schema({
  event_id: String,
  compName: String,
  place: String,
  time: String,
  subscriptions: [],
  date: Date,
  cost: {
    currency: String,
    amount: Number,
  },
})

[...]
现在我所有的路线都很好,除了最后一条。我想先按事件id筛选,然后再按子id筛选,以确定要删除的正确订阅。
然后我使用$pulls尝试删除订阅,但它不起作用,有人有想法吗?
http文件:

const express = require('express')

import * as bodyParser from 'body-parser'
// import { eventApplication } from './compositionRoot'
import { CompetitionModel } from './mongo'

export const app = express()

app.use(bodyParser.json())
// WORKS - find all events
app.get('/events', async (_req: any, res: any) => {
  const comp = await CompetitionModel.find()
  res.send(comp)
})

// WOKRS - find just one event
app.get('/events/:event_id', async (req: any, res: any) => {
  const searchedComp = await CompetitionModel.find(req.params)
  res.send(searchedComp)
})

// WORKS - posts a new comp event
app.post('/new-comp', async (req: any, res: any) => {
  const data = await new CompetitionModel(req.body).save()
  res.json(data)
})

// WORKS - posts a new subscription into a comp
app.put('/update/:event_id', async (req: any, res: any) => {
  const subs = await CompetitionModel.findOneAndUpdate(
    { event_id: req.params.event_id },
    { $push: { subscriptions: req.body } },
  )
  res.send(subs)
})

// WORKS - deletes a competition event
app.delete('/delete/:event_id', async (req: any, res: any) => {
  const toDel = await CompetitionModel.deleteOne({
    event_id: req.params.event_id,
  })
  res.json(toDel)
})

// TO TEST - removesa subfrom an event
app.post('update/del-sub/:event_id/:id', async (req: any, res: any) => {
  const subToDel = await CompetitionModel.findOneAndUpdate(
    { event_id: req.params.event_id },
    { id: req.params.id },
    { $pull: [req.params.delete] },
  )
  res.send(subToDel)
})


您需要将两个条件组合到一个过滤器中,并将$pull操作作为第二个参数传递到对象中:

await CompetitionModel.findOneAndUpdate(
    { event_id: req.params.event_id },
    { $pull: { subscriptions: req.params.id  } })

所以当我这样做的时候,我实际上已经没有错误了,这是一个巨大的进步。然而,什么也没发生,潜艇还在那里。可能是因为我选择了HTTP请求类型吗?对我来说,这是对文档的修改,因此app.delete看起来不是好的,但可能我弄错了?不,它与http请求方法无关。问题是,
req.params.delete
未定义,并且与任何内容都不匹配。我再次查看了您的代码,似乎
req.params.id
是您要删除的订阅的id-我已经更新了答案,现在应该可以使用了。