Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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
Node.js Mongoose更新子文档(如果存在)_Node.js_Mongodb_Mongoose - Fatal编程技术网

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

Node.js Mongoose更新子文档(如果存在),node.js,mongodb,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 : [VoteSch

我有以下型号:

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})随时对问题进行投票如果
用户1
尚未对
问题1
进行投票,我如何添加
新的
投票。

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

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有处理这类更新的本机方法,但当然您确实需要按原样测试匹配

我们可以在文档存在的
true
false
条件下工作

考虑将
vote.value
作为“向上投票”的
true
false

如果您发现有匹配的文档,您可以发布如下更新:

Question.update(
  { 
    _id: questionId, 
    "votes.createdBy" vote.createdBy,
    "votes.up": {"$ne": vote.value }
  },
  { $set: { "votes.$.up": vote.value } }
);
因此,它匹配并使用
$
运算符来确保更新匹配项的正确索引。我在那里添加的内容确保了您甚至不会触碰
vote.vaule
已经具有相同值的文档

在错误条件下,您希望使用项添加到数组中:

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

当然,在应用了
writeConcern
的位置添加回调详细信息,您可能会这样做。

我想您正在尝试执行“upsert”。请检查此项@suish这不是一个
upsert
,它是将一个不存在的项推送到数组中,或者在它存在的地方进行更新。该阵列是嵌入式的。非常好,这也许是解决这类问题的唯一方法。是否可以在
$设置
之后获取
位置-$
的值。我在cb
[1,{updatedeexisting:true,n:1,connectionId:93,err:null,ok:1}]
@Lekhnath-Um中得到了这个信息,我不太确定。你看到的是受影响的部分。回调中的第三个参数应该是rawResponse(不管是什么),因此您可以查看它,看看是否有什么有趣的内容。