【问题标题】:Mongo append to existing key ($addToSet)Mongo 附加到现有密钥 ($addToSet)
【发布时间】:2016-03-24 08:45:08
【问题描述】:

我有这个猫鼬模式:

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

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

我正在使用这个PUT 请求:

app.put('/api/listing/:street/:buildingNumber/:apartmentNumber/addUserInput/:userid/:listingid/:questionid')

所以我手头有所有必要的参数。

通常,当我想更新架构中的字段时,我会使用我编写的以下代码:

app.put('/api/listing/:street/:buildingNumber/:apartmentNumber/addUserInput/:userid/:listingid/:questionid', function (req, res) {
    console.log("adding user and question he answered to listing schema");
    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), questionID: ObjectId(questionToAdd)}}}
        , function (err, listing) {
            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!");
                res.send("Success!");
            }
        })
});

这可以防止完全重复相同的 UsersAndQuestions 条目。

我的问题是:我希望如果userID 存在,那么它将追加 questionIDuserID questionID 数组。怎么办?

例子:

到目前为止,如果我的 JSON 看起来像这样:

{
  "_id": "567300e694745bfce5bf6ed2",
  "street": "Rines",
  "buildingNumber": 1,
  "apartmentNumber": 1,
  "UsersAndQuestions": [
    {
      "userID": "564b343fbc2d4310156c6bf9",
      "questionID": [
        "5661db59b0b1b91c1d63643d"
      ]
    }
  ]
}

我使用相同的userID、相同的listingID 执行PUT,但不同 questionID 我得到:

{
  "_id": "567300e694745bfce5bf6ed2",
  "street": "Rines",
  "buildingNumber": 1,
  "apartmentNumber": 1,
  "UsersAndQuestions": [
    {
      "userID": "564b343fbc2d4310156c6bf9",
      "questionID": [
        "5661db59b0b1b91c1d63643d"
      ]
    },
    {
      "userID": "564b343fbc2d4310156c6bf9",
      "questionID": [
        "5669d90a058ceddc158e97e2"
      ]
    }
  ]
}

而我想要得到的是:

{
  "_id": "567300e694745bfce5bf6ed2",
  "street": "Rines",
  "buildingNumber": 1,
  "apartmentNumber": 1,
  "UsersAndQuestions": [
    {
      "userID": "564b343fbc2d4310156c6bf9",
      "questionID": [
        "5661db59b0b1b91c1d63643d", "5669d90a058ceddc158e97e2"
      ]
    }
  ]
}

做我想做的事的正确语法是什么?

非常感谢! :)

【问题讨论】:

标签: javascript json node.js mongodb mongoose


【解决方案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){

            })
    }
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多