mongimport upsert创建新文档

时间:2018-10-10 13:13:26

标签: mongodb mongoimport

当我尝试像这样用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标志不会改变任何内容。始终会创建新文档。

Dubplicate documents with same Data despite upsertFields

给我的印象是,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    

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您在TSV标头中有一个与引号相关的问题,与此类似:https://jira.mongodb.org/browse/TOOLS-61

在上面的屏幕截图中,您会发现您的字段名称不是arm64-v8a而是MyCustomUpsertField-包括引号。

所以您想要做的是从文件中删除引号(我强烈建议这样做,因为它在JSON级别上看起来很时髦,我认为这会在某些地方引起问题),或者找到一种在命令行,就像这样:

"MyCustomUpsertField"

请记住,我还没有尝试过上面的方法,并且猜测它的行为可能不符合预期。

相关问题