node.js - Mongoose 更新子文档(如果存在)

标签 node.js mongodb mongoose

我有以下模型:

var VoteSchema = new Schema({
    up : Boolean
    , createdBy:{type:ObjectId, ref:'users'}
    , createdOn : {type:Date, default:Date.now}
});

var QuestionSchema = newSchema({
    title:String
    , description:String
    , votes : [VoteSchema]
    , createdBy:{type:ObjectId, ref:'users'}
    , createdOn : {type:Date, default:Date.now}
});

var Question = mongoose.model('questions',QuestionSchema);

假设 user1 已登录用户并且 question1 是当前/正在查看的问题。用户可以upvote({up:true}) 或随时downvote({up:false}) 一个问题。 如果 user1 还没有为 question1 投票,我该如何添加一个新的vote else 更新投票。

我已经能够编写以下代码行:

QuestionSchema.statics.castVote = function(questionId, vote) {
    //NOTE : vote.createdBy equalsto loggedInUserID

    Q.nbind(Question.findOne, Question)({
        $and:[
            {_id:questionId},
            {'votes.createdBy':vote.createdBy}
        ]
    }).then(function(doc) {

        if(doc) {
           //I am clue less
           //doc.votes is a list of votes for this question
           // how can I get the particular vote casted by the user - vote.createdBy
        }else {
           //Question.votes.push(vote);
        }
    });

});

最佳答案

因此,您是其中的一部分,但是当然,当您找不到 doc 时,您将没有 doc 可以在打回来。 MongoDB 有处理这类更新的 native 方法,但是您当然需要按原样测试匹配

我们在这里可以做的只是在文档存在的truefalse 条件下工作。

考虑 vote.value 是你的 truefalse 的“upvote”

如果您发现有匹配文档,您可以像这样发布更新:

Question.update(
  { 
    _id: questionId, 
    "votes.createdBy" vote.createdBy,
    "votes.up": {"$ne": vote.value }
  },
  { $set: { "votes.$.up": vote.value } }
);

因此匹配并使用 positional $ 运算符以确保更新匹配项的正确 index。我在此处添加的内容可确保您甚至不会触摸 vote.vaule 已具有相同值的文档。

在错误的情况下你想要$push使用新的项放到数组上:

Question.update(
  { 
    _id: questionId
  },
  { 
    $push: { 
      "votes": {
        "up": vote.value,
        "createdBy": vote.createdBy
      }
    }
  }
);

当然,在应用 writeConcern 的地方添加回调细节,您可能会这样做。

关于node.js - Mongoose 更新子文档(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22039985/

相关文章:

java - 根据字段是否存在,使用 Spring 从 MongoDB 投影 boolean 值

javascript - 我有 2 个 Mongoose 模式从中获取数据,然后发送它作为响应,但总是在数据解析之前发送响应

javascript - 通过表单输入和 pug 模板渲染器从 Mongodb 检索数据

javascript - 我不能在我的 HTML 中使用 Vue js 的 JS 脚本

javascript - 如何使用 Puppeteer 暂停并等待用户输入?

mysql - Lambda 函数 MySQL 结果不适用于 NodeJs 8.10

javascript - 如何获取数组中 objectId 的内容 - Mongoose/NodeJs

node.js - 如果条件在 mjml 版本 3.3.5 中不起作用

arrays - 根据元素的位置删除mongoDB中的数组元素

ruby-on-rails - 是否有支持 MongoDB 和 Devise 的 Rails 管理界面?