【问题标题】:How to remove an array element from Mongodb如何从 Mongodb 中删除数组元素
【发布时间】:2020-04-16 23:23:37
【问题描述】:

我是 MEAN 堆栈的新手。我正在尝试实现thisthis。我正在使用$pull。但他们没有工作可能是因为我在 mongodb 中的结构与他们的不同。所以让我先告诉你:

downvoters 是一个字符串数组,其中包含对该特定文章投反对票的用户 ID。假设downvoters[2] 上的人,即53et853rf,后来对这篇文章投了赞成票。那么他的用户ID 应该从反对票列表中删除。这是我的代码:

api.js

router.put('/update-upvotes', (req, res) => {
  let articleData = req.body;
  ...
  Article.update(
    {articleid: '5p4aqbryi'},
    { $pull: { downvoters: '53et853rf' } }
  );
  Article.findOneAndUpdate(
    {articleid: '5p4aqbryi'},
    {upvotes: articleData.upvotes, upvoters: articleData.upvoters}, useFindAndModify=false,
    (error, user) => {
      if(error) {
        ...
      }
      else {
        ...
      }
    })
   })

但是那个id没有被删除。控制台上没有错误或警告。请纠正我。

这是架构

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const articleSchema = new Schema({
  articleid: String,
  title: String,
  content: String,
  date: String,
  contributor: String,
  upvotes: Number,
  upvoters: [],
  downvotes: Number,
  downvoters: []
})
module.exports = mongoose.model('article', articleSchema, 'articles');

PS:现在让articleIddownvoter id 进行硬编码。稍后我会让它们动态化。

【问题讨论】:

  • 在末尾添加.catch(e=>console.log(e)) 用于错误记录。
  • 已添加。但仍然没有错误或警告。它只是没有做我的工作。

标签: javascript node.js mongodb typescript mongoose


【解决方案1】:

upvotersdownvoters 都是 String 数组,因此您的 Mongoose 架构应如下所示:

const articleSchema = new Schema({
    articleid: String,
    title: String,
    content: String,
    date: String,
    contributor: String,
    upvotes: Number,
    upvoters: [String],
    downvotes: Number,
    downvoters: [String]
});

您还应该记住,update() 是一个异步操作,需要 awaited 或作为 Promise 处理,因此:

let opResult = await Article.update(
    {articleid: '5p4aqbryi'},
    { $pull: { downvoters: '53et853rf' } }
);

Article.update(
        { articleid: '5p4aqbryi' },
        { $pull: { downvoters: '53et853rf' } }
    ).then(opResult => console.log(opResult));

【讨论】:

  • 感谢您的帮助。但第一个解决方案是给出这个错误:SyntaxError: await is only valid in async function。而第二个完全没有变化,什么也没发生。
  • 您需要将您的函数标记为异步,例如:async () => { await Article.update(...) }。除此之外,我已经测试了您的示例并且它有效,因此请确保您在数据所在的集合上运行查询。尝试确保 Article.findOne({ articleId: '5p4aqbryi' }) 返回您尝试修改的文档。
  • 请确保您正在“等待”第一个函数的执行。否则updatefindOneAndUpdate 可能会相互干扰。如果你不能在update()的回调中使用等待运行findOneAndUpdate
  • @Tanzeel 经验教训 - update 返回 Promise 需要 await-ed 或者继续应该以 .then() 运行,否则操作将不会被执行
  • 我会永远记住这一点。 :-)。顺便一提。你可以看到这个:fast-depths-77615.herokuapp.com/options。这就是我正在做的。
猜你喜欢
  • 2017-12-22
  • 2015-06-12
  • 1970-01-01
  • 2020-08-19
  • 2013-06-02
  • 2016-02-25
相关资源
最近更新 更多