当我尝试像这样用mongoimport
执行upsertFields
时:
> mongoimport --db upsert-test --collection data --type tsv --headerline --file upsert-data.tsv --upsertFields MyCustomUpsertField -vvv
2018-10-10T15:08:39.358+0200 using upsert fields: [MyCustomUpsertField]
2018-10-10T15:08:39.424+0200 using 8 decoding workers
2018-10-10T15:08:39.424+0200 using 1 insert workers
2018-10-10T15:08:39.425+0200 will listen for SIGTERM, SIGINT, and SIGKILL
2018-10-10T15:08:39.425+0200 filesize: 61 bytes
2018-10-10T15:08:39.426+0200 using fields: "MyCustomUpsertField","SomeData"
2018-10-10T15:08:39.431+0200 connected to: localhost
2018-10-10T15:08:39.431+0200 ns: upsert-test.data
2018-10-10T15:08:39.431+0200 connected to node type: standalone
2018-10-10T15:08:39.432+0200 standalone server: setting write concern w to 1
2018-10-10T15:08:39.432+0200 using write concern: w='1', j=false, fsync=false, wtimeout=0
2018-10-10T15:08:39.432+0200 standalone server: setting write concern w to 1
2018-10-10T15:08:39.432+0200 using write concern: w='1', j=false, fsync=false, wtimeout=0
2018-10-10T15:08:39.433+0200 got line: ["Upsert-ID-1" "SomeData1"]
2018-10-10T15:08:39.433+0200 imported 1 document
然后再次执行相同的命令,结果是两个文档的数据完全相同。
添加(据说已经过时的)--mode upsert
标志不会改变任何内容。始终会创建新文档。
给我的印象是,upserFields
将使用MyCustomUpsertField == "Upsert-ID-1"
搜索已经存在的文档并更新这些文档而不是创建新文档?
环境信息
> mongo --version
MongoDB shell version v4.0.0
git version: 3b07af3d4f471ae89e8186d33bbb1d5259597d51
allocator: tcmalloc
modules: none
build environment:
distmod: 2008plus-ssl
distarch: x86_64
target_arch: x86_64
> mongoimport --version
mongoimport version: r4.0.0
git version: 3b07af3d4f471ae89e8186d33bbb1d5259597d51
Go version: go1.8.5
os: windows
arch: amd64
compiler: gc
OpenSSL version: OpenSSL 1.0.2o-fips 27 Mar 2018
我在做什么错了?
答案 0 :(得分:1)
您在TSV标头中有一个与引号相关的问题,与此类似:https://jira.mongodb.org/browse/TOOLS-61
在上面的屏幕截图中,您会发现您的字段名称不是arm64-v8a
而是MyCustomUpsertField
-包括引号。
所以您想要做的是从文件中删除引号(我强烈建议这样做,因为它在JSON级别上看起来很时髦,我认为这会在某些地方引起问题),或者找到一种在命令行,就像这样:
"MyCustomUpsertField"
请记住,我还没有尝试过上面的方法,并且猜测它的行为可能不符合预期。