如何使用GridStore存储具有多键ID的文档?
我正在使用GridStore,并且我想要存储具有多个键的Id的文档。
我试过这个:
var gridStore = new GridStore(db, {uuid: uuid, format: fileName}, 'w'); // Open the file gridStore.open(function (err, gridStore) { // Write some data to the file gridStore.write(data, function (err, gridStore) { assert.equal(null, err); // Close (Flushes the data to MongoDB) gridStore.close(function (err, result) { assert.equal(null, err); // Verify that the file exists GridStore.exist(db, {uuid: uuid, format: fileName}, function (err, result) { assert.equal(null, err); assert.equal(true, result); }); }); }); });
但它失败,因为assert.equal(true, result);
声明。
如何使用GridStore存储具有多键ID的文档?
您应该提供一个文件名到GridStore的构造函数,它将工作:
var gridStore = new GridStore(db, {uuid: uuid, format: fileName}, 'foobar', 'w');
我通过GitHub上的GridStore 源代码挖掘,发现这段代码(只显示相关部分):
if(typeof mode === 'undefined') { mode = filename; filename = undefined; } if(id instanceof ObjectID) { this.referenceBy = REFERENCE_BY_ID; this.fileId = id; this.filename = filename; } else if(typeof filename == 'undefined') { this.referenceBy = REFERENCE_BY_FILENAME; this.filename = id; if (mode.indexOf('w') != null) { this.fileId = new ObjectID(); } } else { this.referenceBy = REFERENCE_BY_ID; this.fileId = id; this.filename = filename; }
所以基本上,如果你不提供filename
选项,GridStore将通过文件名来引用文档,并且将为_id
字段创build一个新的ObjectId。 如果你提供文件名选项, _id
将是你指定的。
您也可以通过检查fs.files
集合并检查文件的_id
值来validation这一点。