【问题标题】:Mongo insert/update - One to Many ModelMongo 插入/更新 - 一对多模型
【发布时间】:2017-03-16 03:15:53
【问题描述】:

我刚刚开始学习 mongodb 并开始为自己的业务开发个人应用程序。

我将在这里解释我的问题,因为我自己无法解决,我尝试了很多方法。

我这样创建一个对象:

db.morosos.insert({
"idlor": "XXXXX",
"comunidad": "XXXXX",
"vivienda": "XXXXX",
"demandado": "XXXXX",
"importe": "XXXXX",
"datos": [
    {
        "fecha": "XXXXXX",
        "dato": "XXXXXX"
    }],
"date": new Date("<dd-mm-YYYY>")})

然后我想用新的“fecha”和新的“dato”像数组一样添加新的“datos”。

我尝试使用:

db.morosos.updateOne(
  { "idlor" : "XXXXX" },
  { $inc: { "datos" : { "fecha": "XXXXX", "dato": "XXXX" } } }   )

 db.morosos.updateOne(
  { "idlor" : "XXX" },
  { $push: { "datos" : { "fecha": "XXXXX",
        "dato": "XXXX" } } }   )

db.morosos.update(
   { "idlor" : "XXXX" },
   {
       $addToSet: {
           "datos": {
                "fecha": "XXXXX",
                "dato": "XXXXX" 
                }
           }
       }   )

没有人能像我想要的那样工作,它只会改变信息或让我失败,比如:

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
            "code" : 16837,
            "errmsg" : "Cannot apply $addToSet to a non-array field. Field named 'datos' has a non-array type Object in the document _id: ObjectId('58c81ba0fb02f3066e2af169')"
    }})
WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
            "code" : 16837,
            "errmsg" : "The field 'datos' must be an array but is of type Object in document {_id: ObjectId('58c81ba0fb02f3066e2af169')}"
    }})

所以目前我不知道该怎么办,我还在寻找如何解决它。

谢谢。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    编辑:您确定您正在使用支持 updateOne 命令的 mongodb 服务器 3.2 或更高版本吗?如果没有,请使用 .update() 命令而不是 .updateOne()

     db.morosos.updateOne(
      { "idlor" : "XXX" },
      { $push: { "datos" : { "fecha": "XXXXX",
            "dato": "XXXX" } } }   )
    

    应该可以,但您的更新查询 { "idlor" : "XXX" } 与示例文档不匹配。

    我更改了 idlor 以匹配示例文档(XXX 到 XXXXXX)

    >  db.morosos.updateOne(
    ...   { "idlor" : "XXXXX" },
    ...   { $push: { "datos" : { "fecha": "XXXXX",
    ...         "dato": "XXXX" } } }   )
    

    推送效果很好

    > db.morosos.findOne()
    {
        "_id" : ObjectId("58c9890a57c5133b63c05b86"),
        "idlor" : "XXXXX",
        "datos" : [
            {
                "fecha" : "XXXXXX",
                "dato" : "XXXXXX"
            },
            {
                "fecha" : "XXXXX",
                "dato" : "XXXX"
            }
        ],
    }
    

    【讨论】:

    • 感谢您的尝试帮助,但是兄弟,XXX只是不写信息的示例。使用 X 作为变量,这里认为 XXX 与 XXXXXX 相同。
    • 你确定mongodb server 3.2 或更高版本有updateone 命令吗?确切的命令似乎适用于我在 ubuntu 上的 3.2
    • 我正在使用 mLab 免费服务器。 mongod 版本:3.2.11 (MMAPv1)
    • 2017-03-15T20:24:29.727+0100 E QUERY [thread1] WriteError: 字段 'datos' 必须是一个数组,但在文档 {_id: ObjectId('58c81ba0fb02f3066e2af169' )} : WriteError({ "index" : 0, "code" : 16837, "errmsg" : "字段 'datos' 必须是一个数组,但在文档 {_id: ObjectId('58c81ba0fb02f3066e2af169')} 中属于 Object 类型,“op”:{“q”:{“idlor”:“LOR01/16”},“u”:{“$push”:{“datos”:{
    • "fecha" : "27/07/2016", "dato" : "Carta enviada" } } }, "multi" : false, "upsert" : false } }) WriteError@src/ mongo/shell/bulk_api.js:469:48 Bulk/mergeBatchResults@src/mongo/shell/bulk_api.js:836:49 Bulk/executeBatch@src/mongo/shell/bulk_api.js:906:13 Bulk/this.execute @src/mongo/shell/bulk_api.js:1150:21 DBCollection.prototype.updateOne@src/mongo/shell/crud_api.js:550:17 @(shell):1:1
    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 2021-07-28
    • 2021-08-24
    • 2015-04-10
    • 1970-01-01
    • 2021-09-22
    • 2011-05-21
    • 2021-12-14
    相关资源
    最近更新 更多