如何在 Node.js 猫鼬中使用 explain()
How to use explain() in Node.js mongoose
我试图在我的控制台上查看 executionStats,但我总是得到 undefined
或 [object, object]
。我只有一个简单的查询,我想在其中查看一些统计信息。有人可以解释为什么这不起作用吗?如果我只是使用我的查询进行查询(而不使用 explain()
),则查询成功。
这是我在尝试对所有其他代码使用 explain 时的查询。我想查看查询的性能,所以我发现获得性能时间的最佳方法是使用 explain()
.
const timeFunction2 = new Promise((resolve, reject) => {
var startTime = performance.now();
setTimeout(() => {
conn.collection('galery').find({ "user_id": req.session.userId}).explain("executionStats", (err, explain) => {
console.log('MongoDebug: ' + explain[0]);
});
var endTime = performance.now();
resolve(endTime - startTime);
});
});
timeFunction2.then(time => {
console.log(`${time} ms.`);
});
这是我的查询代码,我可以在其中成功获取数据并将其显示在我的页面上
const timeFunction2 = new Promise((resolve, reject) => {
var startTime = performance.now();
setTimeout(() => {
conn.collection('galery').find({ "user_id": req.session.userId}).toArray( (err, resultImg) =>{
.
.
.
});
var endTime = performance.now();
resolve(endTime - startTime);
});
});
timeFunction2.then(time => {
console.log(`${time} ms.`);
});
这是我 MongoDB 调试的输出:
MongoDebug: {
queryPlanner: {
plannerVersion: 1,
namespace: 'nodejsnosql.galerija',
indexFilterSet: false,
parsedQuery: { uporabnik_id: [Object] },
winningPlan: { stage: 'COLLSCAN', filter: [Object], direction: 'forward' },
rejectedPlans: []
},
executionStats: {
executionSuccess: true,
nReturned: 3,
executionTimeMillis: 0,
totalKeysExamined: 0,
totalDocsExamined: 5,
executionStages: {
stage: 'COLLSCAN',
filter: [Object],
nReturned: 3,
ok: 1,
'$clusterTime': {
clusterTime: new Timestamp({ t: 1644428067, i: 1 }),
signature: {
hash: new Binary(Buffer.from("71a216b111009bfcef6bd4923029d8df7a219e1a", "hex"), 0),
keyId: new Long("7027534341366349828")
}
},
operationTime: new Timestamp({ t: 1644428067, i: 1 })
}
您需要更改将说明对象记录到控制台的方式。
conn.collection('galery').find({ "user_id": req.session.userId}).explain("executionStats", (err, explain) => {
console.log('MongoDebug: ' + explain[0]);
});
通过使用 'MongoDebug: ' + explain[0]
,您在 explain[0]
上隐式调用 .toString()
,因为您将它附加到一个字符串,因此它必须是一个字符串。对于对象,这会将它们转换为 [object, Object]
.
相反,您可以将其作为单独的对象传递给您的 console.log:
console.log('MongoDebug: ', explain);
或将其转换为带有额外间距的 JSON 以提高可读性:
console.log(JSON.stringify(explain, null, 2));
我试图在我的控制台上查看 executionStats,但我总是得到 undefined
或 [object, object]
。我只有一个简单的查询,我想在其中查看一些统计信息。有人可以解释为什么这不起作用吗?如果我只是使用我的查询进行查询(而不使用 explain()
),则查询成功。
这是我在尝试对所有其他代码使用 explain 时的查询。我想查看查询的性能,所以我发现获得性能时间的最佳方法是使用 explain()
.
const timeFunction2 = new Promise((resolve, reject) => {
var startTime = performance.now();
setTimeout(() => {
conn.collection('galery').find({ "user_id": req.session.userId}).explain("executionStats", (err, explain) => {
console.log('MongoDebug: ' + explain[0]);
});
var endTime = performance.now();
resolve(endTime - startTime);
});
});
timeFunction2.then(time => {
console.log(`${time} ms.`);
});
这是我的查询代码,我可以在其中成功获取数据并将其显示在我的页面上
const timeFunction2 = new Promise((resolve, reject) => {
var startTime = performance.now();
setTimeout(() => {
conn.collection('galery').find({ "user_id": req.session.userId}).toArray( (err, resultImg) =>{
.
.
.
});
var endTime = performance.now();
resolve(endTime - startTime);
});
});
timeFunction2.then(time => {
console.log(`${time} ms.`);
});
这是我 MongoDB 调试的输出:
MongoDebug: {
queryPlanner: {
plannerVersion: 1,
namespace: 'nodejsnosql.galerija',
indexFilterSet: false,
parsedQuery: { uporabnik_id: [Object] },
winningPlan: { stage: 'COLLSCAN', filter: [Object], direction: 'forward' },
rejectedPlans: []
},
executionStats: {
executionSuccess: true,
nReturned: 3,
executionTimeMillis: 0,
totalKeysExamined: 0,
totalDocsExamined: 5,
executionStages: {
stage: 'COLLSCAN',
filter: [Object],
nReturned: 3,
ok: 1,
'$clusterTime': {
clusterTime: new Timestamp({ t: 1644428067, i: 1 }),
signature: {
hash: new Binary(Buffer.from("71a216b111009bfcef6bd4923029d8df7a219e1a", "hex"), 0),
keyId: new Long("7027534341366349828")
}
},
operationTime: new Timestamp({ t: 1644428067, i: 1 })
}
您需要更改将说明对象记录到控制台的方式。
conn.collection('galery').find({ "user_id": req.session.userId}).explain("executionStats", (err, explain) => {
console.log('MongoDebug: ' + explain[0]);
});
通过使用 'MongoDebug: ' + explain[0]
,您在 explain[0]
上隐式调用 .toString()
,因为您将它附加到一个字符串,因此它必须是一个字符串。对于对象,这会将它们转换为 [object, Object]
.
相反,您可以将其作为单独的对象传递给您的 console.log:
console.log('MongoDebug: ', explain);
或将其转换为带有额外间距的 JSON 以提高可读性:
console.log(JSON.stringify(explain, null, 2));