Node.js mongo中删除数组元素的$pull请求
我有一个node和mongo应用程序,允许用户注册竞赛活动并发布对这些活动的订阅。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
正如您在下面的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-我已经更新了答案,现在应该可以使用了。