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

Posted

技术标签:

【中文标题】具有多个值的 Mongo $addToSet 语法正确【英文标题】:Mongo $addToSet with multiple values correct syntax 【发布时间】:2016-03-24 06:54:38 【问题描述】:

我有这个猫鼬模式:

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

执行我尝试执行的操作的正确语法是什么?

非常感谢! :)

【问题讨论】:

【参考方案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)

                )
        
)

【讨论】:

非常感谢!你知道我需要改变什么,所以如果用户 ID 存在,它只会将 questionToAdd 添加到该用户问题数组中?

以上是关于具有多个值的 Mongo $addToSet 语法正确的主要内容,如果未能解决你的问题,请参考以下文章

你可以在 Mongo 中为 $addToSet 指定一个键吗?

是否有简单的语法用于在 perl 中声明具有一个值的多个键?

如何在mongo的不同字段中获取具有值的文档数

如何使用带有 Mongoose 的 addToSet 添加多个 ObjectId?

多个返回值的 ODBC 调用语法

如何声明多个具有相同值的变量