C++正在写入mongo,字符串字段在聚合管道中不起作用



**快速总结:C++应用程序使用OTL4从SQL server加载数据,使用mongocxx-bulk_write写入Mongo,字符串似乎以某种方式被损坏,因此它们在聚合管道中不起作用(但在其他方面看起来很好)。**

我有一个简单的Mongo集合,当我投影多个字段时,它在聚合管道中的行为似乎不像预期的那样。这是一个琐碎的文档,没有嵌套,字段只是双精度和字符串。

前2个查询按预期工作:

> db.TemporaryData.aggregate( [ { $project :  {  ParametersId:1 } } ] )
{ "_id" : ObjectId("5c28f751a531251fd0007c72"), "ParametersId" : 526988617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c73"), "ParametersId" : 526988617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c74"), "ParametersId" : 526988617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c75"), "ParametersId" : 526988617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c76"), "ParametersId" : 526988617 }
> db.TemporaryData.aggregate( [ { $project :  {  Col1:1 } } ] )
{ "_id" : ObjectId("5c28f751a531251fd0007c72"), "Col1" : 575 }
{ "_id" : ObjectId("5c28f751a531251fd0007c73"), "Col1" : 579 }
{ "_id" : ObjectId("5c28f751a531251fd0007c74"), "Col1" : 616 }
{ "_id" : ObjectId("5c28f751a531251fd0007c75"), "Col1" : 617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c76"), "Col1" : 622 }

但是合并并没有像预期的那样返回两个字段。

> db.TemporaryData.aggregate( [ { $project :  {  ParametersId:1, Col1:1 } } ] )
{ "_id" : ObjectId("5c28f751a531251fd0007c72"), "ParametersId" : 526988617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c73"), "ParametersId" : 526988617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c74"), "ParametersId" : 526988617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c75"), "ParametersId" : 526988617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c76"), "ParametersId" : 526988617 }

它似乎是特定于ParametersId字段的,例如,如果我选择另外两个字段,那就可以了

> db.TemporaryData.aggregate( [ { $project :  {  Col1:1, Col2:1 } } ] )
{ "_id" : ObjectId("5c28f751a531251fd0007c72"), "Col1" : 575, "Col2" : "1101-2" }
{ "_id" : ObjectId("5c28f751a531251fd0007c73"), "Col1" : 579, "Col2" : "1103-2" }
{ "_id" : ObjectId("5c28f751a531251fd0007c74"), "Col1" : 616, "Col2" : "1300-3" }
{ "_id" : ObjectId("5c28f751a531251fd0007c75"), "Col1" : 617, "Col2" : "1300-3" }
{ "_id" : ObjectId("5c28f751a531251fd0007c76"), "Col1" : 622, "Col2" : "1400-3" }

出于某种原因,当我包含ParametersId字段时,管道中的所有地狱都会崩溃:

> db.TemporaryData.aggregate( [ { $project :  {  ParametersId:1, Col2:1, Col1:1, Col3:1 } } ] )
{ "_id" : ObjectId("5c28f751a531251fd0007c72"), "ParametersId" : 526988617, "Col1" : 575 }
{ "_id" : ObjectId("5c28f751a531251fd0007c73"), "ParametersId" : 526988617, "Col1" : 579 }
{ "_id" : ObjectId("5c28f751a531251fd0007c74"), "ParametersId" : 526988617, "Col1" : 616 }
{ "_id" : ObjectId("5c28f751a531251fd0007c75"), "ParametersId" : 526988617, "Col1" : 617 }
{ "_id" : ObjectId("5c28f751a531251fd0007c76"), "ParametersId" : 526988617, "Col1" : 622 }

DB版本和数据:

> db.version()
4.0.2
> db.TemporaryData.find()
{ "_id" : ObjectId("5c28f751a531251fd0007c72"), "CellId" : 998909269, "ParametersId" : 526988617, "Order" : 1, "Col1" : 575, "Col2" : "1101-2", "Col3" : "CHF" }
{ "_id" : ObjectId("5c28f751a531251fd0007c73"), "CellId" : 998909269, "ParametersId" : 526988617, "Order" : 1, "Col1" : 579, "Col2" : "1103-2", "Col3" : "CHF" }
{ "_id" : ObjectId("5c28f751a531251fd0007c74"), "CellId" : 998909269, "ParametersId" : 526988617, "Order" : 1, "Col1" : 616, "Col2" : "1300-3", "Col3" : "CHF" }
{ "_id" : ObjectId("5c28f751a531251fd0007c75"), "CellId" : 998909269, "ParametersId" : 526988617, "Order" : 36, "Col1" : 617, "Col2" : "1300-3", "Col3" : "CHF" }
{ "_id" : ObjectId("5c28f751a531251fd0007c76"), "CellId" : 998909269, "ParametersId" : 526988617, "Order" : 1, "Col1" : 622, "Col2" : "1400-3", "Col3" : "CHF" }

更新:查询字段名称没有区别。我在mongo.exe命令行中输入了以上所有内容,但我在C++应用程序中看到了同样的行为,它有一个稍微复杂一点的管道(投影所有字段以保证顺序)。

这个应用程序实际上一开始就在创建数据——有人知道可能出错的地方吗?全部使用mongocxx-lib。

**更新**

结果发现我对琴弦的处理出了问题。数据中没有字符串字段,一切都很好。所以,不知怎么的,我已经把我的字符串弄坏了,尽管它们在其他方面看起来和行为都很正确,但它们在聚合管道中表现得并不好。我使用mongocxx::collection.bulk_write编写标准std::字符串,这些字符串通过OTL4头从sql server加载。当它们被内部存储时,中间有一个strncpy_s。我似乎无法创建一个简单的可复制的例子。

为了确保与其他任何东西都没有冲突,请尝试使用带有严格格式json的投影:(向键添加引号)

db.TemporaryData.aggregate( [ { $project :  {  "ParametersId":1, "Col1":1 } } ] )

最终发现问题是文档损坏,因为我使用bulk_write进行插入,这些文档进入了数据库,但导致了这种奇怪的行为。我切换到使用insert_many,这会导致文档损坏,然后我可以追踪到错误。

这些文档已损坏,因为我多次写入相同的字段值数据,这似乎破坏了我用来构造它们的bsoncxx::builder::stream::文档。

相关内容

  • 没有找到相关文章

最新更新