debugging文档validation错误

从mongo shell: db.getCollectionInfos({ name : 'applications' })返回:

 [ { "name" : "applications", "type" : "collection", "options" : { "validator" : { "$and" : [ { "user_name" : { "$type" : "string" } }, { "password" : { "$type" : "string" } }, { "role" : { "$type" : "bool" } }, { "deposit_amount" : { "$type" : "double" } }, { "submit_date" : { "$type" : "int" } }, { "user_ip" : { "$type" : "string" } } ] }, "validationLevel" : "strict", "validationAction" : "error" }, "info" : { "readOnly" : false }, "idIndex" : { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "turk_system.applications" } } ] 

在node.js中,试图使用官方的mongodb驱动程序来插入文档:

 //... db.collection('applications').insertOne ( { 'user_name' : 'test123', 'password' : 'test123', 'role' : true, 'deposit_amount' : Number.parseFloat('34.5'), 'submit_date' : mongodb.Long.fromNumber(500), 'user_ip' : '192.168.100.1' } ) .then((result) => { //... }) .catch((err) => { console.log(err); }); 

捕获错误:

 { MongoError: Document failed validation at Function.MongoError.create (/loc/to/node_modules/mongodb-core/lib/error.js:31:11) at toError (/loc/to/node_modules/mongodb/lib/utils.js:139:22) at /loc/to/node_modules/mongodb/lib/collection.js:748:67 at /loc/to/node_modules/mongodb-core/lib/connection/pool.js:469:18 at _combinedTickCallback (internal/process/next_tick.js:131:7) at process._tickCallback (internal/process/next_tick.js:180:9) name: 'MongoError', message: 'Document failed validation', driver: true, index: 0, code: 121, errmsg: 'Document failed validation' } 

Mongodb文档validation错误不是非常具有描述性,但我的猜测是mongo和node.js如何表示types之间存在一些不匹配,但是我不确定在哪里。

我如何解决上述问题?

(mongodb版本:v3.4.4,在linux上)

不,它不是很具描述性,基本上就是你所能得到的。 这是一个非常新的function,所以您唯一真正的“debugging”是通过查看您发送的客户端代码。 它失败,因为Long返回一个64位整数 “定义一个长类来表示一个64位二进制补码” ,而你的约束是寻找一个32位整数。 它应该是"long"而不是"int" 。 请参阅$type

  { "submit_date" : { "$type" : "long" } }, 

或者你使用.toInt()来返回一个32位的整数

 { 'user_name' : 'test123', 'password' : 'test123', 'role' : true, 'deposit_amount' : Number.parseFloat('34.5'), 'submit_date' : mongodb.Long.fromNumber(500).toInt(), 'user_ip' : '192.168.100.1' } 

只要它是一个值,实际上可以表示为一个32位的整数。

如果你正在寻找“模式”,那么你应该“而不是”看在客户端的实现。 文档validation并不是为了取代这种function,而且您将从服务器上获取“客户端”提交的更详细的错误消息。