【问题标题】:How to update a subdocument in mongodb如何在 mongodb 中更新子文档
【发布时间】:2015-05-14 18:14:41
【问题描述】:

我知道这个问题已经被问过很多次了,但我不知道如何在 mongo 中更新子文档。

这是我的架构:

// Schemas
var ContactSchema = new mongoose.Schema({
  first: String,
  last: String,
  mobile: String,
  home: String,
  office: String,
  email: String,
  company: String,
  description: String,
  keywords: []
});

var UserSchema = new mongoose.Schema({
  email: {
      type: String,
      unique: true,
      required: true
  },
  password: {
      type: String,
      required: true
  },
  contacts: [ContactSchema]
});

我的收藏是这样的:

db.users.find({}).pretty()
{
    "_id" : ObjectId("5500b5b8908520754a8c2420"),
    "email" : "test@random.org",
    "password" :     "$2a$08$iqSTgtW27TLeBSUkqIV1SeyMyXlnbj/qavRWhIKn3O2qfHOybN9uu",
    "__v" : 8,
    "contacts" : [
        {
            "first" : "Jessica",
            "last" : "Vento",
            "_id" : ObjectId("550199b1fe544adf50bc291d"),
            "keywords" : [ ]
        },
        {
            "first" : "Tintin",
            "last" : "Milou",
            "_id" : ObjectId("550199c6fe544adf50bc291e"),
            "keywords" : [ ]
        }
    ]
}

假设我想通过以下方式更新 id 为 550199c6fe544adf50bc291e 的子文档:

db.users.update({_id: ObjectId("5500b5b8908520754a8c2420"), "contacts._id": ObjectId("550199c6fe544adf50bc291e")}, myNewDocument)

与 myNewDocument 类似:

{ "_id" : ObjectId("550199b1fe544adf50bc291d"), "first" : "test" }

它返回一个错误:

db.users.update({_id: ObjectId("5500b5b8908520754a8c2420"), "contacts._id":     ObjectId("550199c6fe544adf50bc291e")}, myNewdocument)
WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 16837,
        "errmsg" : "The _id field cannot be changed from {_id:     ObjectId('5500b5b8908520754a8c2420')} to {_id:     ObjectId('550199b1fe544adf50bc291d')}."
    }
})

我了解 mongo 尝试替换父文档而不是子文档,但最后,我不知道如何更新我的子文档。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您需要使用$ operator 来更新数组中的子文档

    使用contacts.$会指向mongoDB更新相关的子文档。

    db.users.update({_id: ObjectId("5500b5b8908520754a8c2420"), 
      "contacts._id": ObjectId("550199c6fe544adf50bc291e")}, 
     {"$set":{"contacts.$":myNewDocument}})
    

    我不确定您为什么要更改子文档的 _id。这是不可取的。

    如果您想更改子文档的特定字段,请使用contacts.$.<field_name> 来更新子文档的特定字段。

    【讨论】:

    • 不幸的是,它触发了错误2015-03-12T16:36:05.188+0100 can't have . in field names [contacts.$] at src/mongo/shell/collection.js:155
    • @user1717735 抱歉,忘记了 $set 运算符。检查编辑。
    • 它有效,非常感谢!我不改_@98​​7654327@,还是一样的。我实际上以编程方式将命令与猫鼬一起使用。我不知道哪些字段会发生变化,因此无法具体说明 contacts.$.<field_name>
    • 我刚刚意识到我不必在我的对象中再次指定_id,我误解了这一点,这就是为什么你有这样的印象,我试图改变_id
    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多