【问题标题】:loopbackjs/mongodb returning duplicate key error on bulk upsert operationloopbackjs/mongodb 在批量更新插入操作中返回重复键错误
【发布时间】:2015-10-12 18:30:08
【问题描述】:

我正在尝试通过对基于环回的 Rest API 使用 PUT 动词来一次更新多个文档。 消息正文包含一个 json 对象数组。

[
   {"_id" : "1",
     "data" : "foo"
    },
     {"_id" : "2",
     "data" : "bar"
    }
]

在空数据库上,这工作得很好(创建)。所有文档都按预期创建。 但是,如果我再次运行相同的调用(更新),我会收到一个错误,其中包含一系列类似的错误消息:

E11000 重复键错误索引:testdatabase.node.$id dup key: { : "1" }

经过进一步调查,我发现如果我传递一个对象,则 upsert 可以正常工作。

{"_id" : "1",
     "data" : "foo"
}

但是:如果我用相同的单个对象传递一个数组,错误又回来了。

[
    {"_id" : "1",
     "data" : "foo"
    }
]

单个 upsert 不是一个选项,因为我必须使用 Rest Api 更新数千个文档。

环回版本:2.22

【问题讨论】:

    标签: angularjs mongodb rest loopbackjs


    【解决方案1】:

    upsert 函数将单个模型作为参数。 看看documentation

    为了根据需要更新不同的模型,您必须使用本机驱动程序。

    编辑

    我研究了环回源代码,发现PUT请求使用了连接器的upsert函数。 这意味着它需要一个模型而不是数组,也许环回不会强制执行它。 可以找到相关代码here

    反正最接近 upserting 多个模型的就是 mongodb 的批量操作,但这会导致自己实现。

    【讨论】:

    • 我部分同意。文档说明“更新或插入模型实例”。但如果我编写了一个自定义实现,那是适用的。我只是使用默认的“开箱即用”PUT 动词。奇怪的是,我可以在空数据库上毫无问题地传递对象数组。尽管如此,我的问题的答案将是相同的。我将不得不编写自己的实现。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 2016-03-15
    • 1970-01-01
    • 2012-04-21
    • 2017-01-31
    • 1970-01-01
    • 2012-04-07
    • 2017-02-21
    相关资源
    最近更新 更多