Node.js 我如何找出MongoDB NodeJS驱动程序不';是否返回单个集合的有效查询结果?
我正在为NodeJS v10.16.0使用MongoDB v3.2.7。我创建了一个MongoRepository基类,我们已经在生产中使用了几年。有时在开发过程中,我会发现奇怪的行为,它不会返回特定集合的任何结果。我过去认为这是因为我没有在查询之间关闭客户机。我现在不太确定 我正在通过一个Express服务器运行代码,还有六个其他调用工作正常。然后我得到这个查询和投影,但没有结果(即使这些在命令行和Robo3T中工作): 质疑= {“pin”:“xxxxxx”,“文档ID”:“5C584A76A6090BB28FF8021CB”,“第1页}, 投影={“_类”:0,“documentId”:0,“pin”:0,“base64”:0}数据=[] 我不知道如何开始调试这个。帮忙 下面是基类代码:Node.js 我如何找出MongoDB NodeJS驱动程序不';是否返回单个集合的有效查询结果?,node.js,mongodb,Node.js,Mongodb,我正在为NodeJS v10.16.0使用MongoDB v3.2.7。我创建了一个MongoRepository基类,我们已经在生产中使用了几年。有时在开发过程中,我会发现奇怪的行为,它不会返回特定集合的任何结果。我过去认为这是因为我没有在查询之间关闭客户机。我现在不太确定 我正在通过一个Express服务器运行代码,还有六个其他调用工作正常。然后我得到这个查询和投影,但没有结果(即使这些在命令行和Robo3T中工作): 质疑= {“pin”:“xxxxxx”,“文档ID”:“5C584A76
import { MongoClient, ObjectId } from 'mongodb';
import 'dotenv/config';
const url = process.env...; // elided to hide our secrets
const dbname = process.env...; // elided to hide our secrets
class MongoRepository
{
/**
* Returns the database using the configuration
*/
async getDatabase()
{
if (!MongoRepository.client)
{
MongoRepository.client = new MongoClient(url, { useNewUrlParser: true });
await MongoRepository.client.connect();
if (!MongoRepository.client || !MongoRepository.client.db(dbname))
{
throw new Error(`Unable to connect to Mongo with URL '${url}'`);
}
}
return MongoRepository.client.db(dbname);
}
/**
* Override this method in children to add any special query filter for a collection.
* @param {*} query query object to modify
*/
addRepositoryFilter(query) {
return query;
}
/**
* Generic find method that takes a query and a projection.
*
* @param {*} query Lookup parameters
* @param {*} projection Fields to return or not return from the search
*
*/
async find(query, projection = {})
{
query = this.addRepositoryFilter(query);
let db = await this.getDatabase();
return await db.collection(this.CollectionName).find(query).project(projection).toArray();
}
}
export default MongoRepository;
下面是未得到结果的子类:
import MongoRepository from "./MongoRepository";
class ViewerPageRepository extends MongoRepository
{
get CollectionName()
{
return 'viewerPage';
}
async findByPinDocumentIdPage(pin, documentId, page, projection)
{
documentId = this.objectIdToString(documentId);
let query = {
pin: pin,
documentId: documentId,
page: page
};
console.log(`Query = ${JSON.stringify(query)}, Projection = ${JSON.stringify(projection)}`);
return await this.find(query, projection);
}
}
export default ViewerPageRepository;
我是在考虑检查查询中
documentId
的类型后发现这一点的。它作为十六进制字符串存储在我查询的集合中。我的代码中没有包含objectIdToString
函数,但是如果它是ObjectId
实例,它会调用documentId
上的valueOf
。这本应将其转换为字符串,但出于某种原因,我返回了另一个ObjectId
实例(可能是我调用的valueOf
on的同一个实例-我没有检查)。因此,这似乎是由MongoDB驱动程序的ObjectId::valueOf
方法中的错误引起的。我将报告这一问题