具有多个值的Mongo $ addToSet正确语法

时间:2015-12-17 17:32:16

标签: javascript json node.js mongodb mongoose

我有这个猫鼬模式:

var listingSchema = new Schema({
        street          : String,
        buildingNumber  : Number,
        apartmentNumber : Number,
        UsersAndQuestions: [{
            userID: String,
            questionID: [String]
        }]
});

我只想更新一个UsersAndQuestions的新条目,该条目包含一个userID String和一个questionID,它也是一个String PUT(但需要插入数组中)。

我正在使用此app.put('/api/listing/:street/:buildingNumber/:apartmentNumber/addUserInput/:userid/:listingid/:questionid') 请求:

app.put('/api/listing/:street/:buildingNumber/:apartmentNumber/addReportedUser/:userid/:listingid', function (req, res) {
        var listingToUpdate = req.params.listingid;
        var idToAdd = req.params.userid;
        Listing.update({_id: ObjectId(listingToUpdate)},
            {$addToSet: {reportedUsersIDs: ObjectId(idToAdd)}}
            , function (err) {
                if (err) {
                    res.send("There was a problem adding the reportedUserID to the listing" + err);
                }
                else {
                    console.log("Success adding reportedUserID to listing!");
                }
            })
    });

所以我掌握了所有必要的参数。

通常,当我想更新模式中的字段时,我使用了我编写的代码:

$addToSet

您可以看到我使用app.put('/api/listing/:street/:buildingNumber/:apartmentNumber/addUserInput/:userid/:listingid/:questionid', function(req,res){ var listingToUpdate = req.params.listingid; var idToAdd = req.params.userid; var questionToAdd = req.params.questionid; Listing.update({_id: ObjectId(listingToUpdate)}, {$addToSet: {UsersAndQuestions.userID : ObjectId(idToAdd), UsersAndQuestions.questionID : ObjectId(questionToAdd)}} , function (err) { if (err) { res.send("There was a problem adding the user and question to the listing" + err); } else{ console.log("Success adding user and question to the listing!"); } }) }); 并且效果很好。但现在我想将两个参数添加到一个数组字段中。我想做这样的事情:

SyntaxError

但我显然得到<span class="glyphicon glyphicon-refresh">&nbsp;Refresh</span>

做我试图做的正确语法是什么?

非常感谢! :)

1 个答案:

答案 0 :(得分:1)

您需要添加对象以设置UsersAndQuestions:

{$addToSet: {UsersAndQuestions: { userID: idToAdd, questionID: questionToAdd } }}

更新。

我会用两个查询来做到这一点:

Listing.update({_id: ObjectId(listingToUpdate), 'UsersAndQuestions.userID': idToAdd}, 
    {"$addToSet": {"UsersAndQuestions.$.questionID": questionToAdd}}
    , function (err, result) {
        if(result.n === 0){
            //we haven't found document with the userId - idToAdd
            //we need to insert to UsersAndQuestions document with this user
            Listing.update({_id: ObjectId(listingToUpdate)},
                {$addToSet: {UsersAndQuestions: { userID: idToAdd, questionID: questionToAdd } }}, 
                function(err, res){

                })
        }
})