脚本注意事项
数据库查询的结果不能在以下上下文中传递:
类构造函数
非异步生成器函数
回调数组上的
.sort()
类中的 JavaScript setter
要访问权限数据库调用的结果,请使用 异步函数 , 异步生成器函数 、或.map()
。
构造函数
以下构造函数不起作用:
// This code will fail class FindResults { constructor() { this.value = db.students.find(); } } // This code will fail function listEntries() { return db.students.find(); } class FindResults { constructor() { this.value = listEntries(); } }
改用 async
函数:
class FindResults { constructor() { this.value = ( async() => { return db.students.find(); } )(); } }
注意
还可以创建一个在类中执行数据库操作的方法,作为使用异步 JavaScript 的替代方法。
class FindResults { constructor() { } init() { this.value = db.students.find(); } }
要使用此类,请首先构造一个类实例,然后调用 .init()
方法。
生成器函数
以下生成器函数不起作用:
// This code will fail function* FindResults() { yield db.students.findOne(); } // This code will fail function listEntries() { return db.students.findOne(); } function* findResults() { yield listEntries(); }
改用 async generator function
:
function listEntries() { return db.students.findOne(); } async function* findResults() { yield listEntries(); }
数组排序
以下数组排序不起作用:
// This code will fail db.getCollectionNames().sort( ( collectionOne, collectionTwo ) => { return db[ collectionOne ].estimatedDocumentCount() - db[ collectionOne ].estimatedDocumentCount() ) } );
改用 .map()
。
db.getCollectionNames().map( collectionName => { return { collectionName, size: db[ collectionName ].estimatedDocumentCount() }; } ).sort( ( collectionOne, collectionTwo ) => { return collectionOne.size - collectionTwo.size; } ).map( collection => collection.collectionName);
这种数组排序方法通常比不支持的等效代码性能更高。
JavaScript Setter
以下 JavaScript setter 不起作用:
// This code will fail class TestClass { value = 1; get property() { return this.value; } // does not work: set property(value) { this.value = db.test.findOne({ value }); } }