node.js - 如何查询 mongoDB 以查看匹配记录是否存在,以及是否返回它以进行更新
问题描述
似乎是一项超级基本的任务,但我就是无法让它工作(对 mongo 或 nodeJS 不是很有经验)。
我有一系列记录。我需要检查数据库以查看是否已经存在任何具有匹配名称的记录,以及它们是否确实抓取了该记录,以便我可以更新它。
现在我正在尝试这个
function hit_the_db(db, record_name, site_id) {
return new Promise((resolve, reject) => {
var record = db.collection('' + site_id + '_campaigns').find({name: record_name}).toArray(function(err, result) {
if (err) {
console.log('...error => ' + err.message);
reject(err);
} else {
console.log('...promise resolved...');
resolve(result);
}
});
console.log('...second layer of select successful, returning data for ' + record.length + ' records...');
return record;
});
}
此查询适用于应用程序的另一部分,因此我尝试将其复制过来,但我没有收到任何返回的记录,即使我知道应该有我发送的数据。
site_id
只是一个看起来像的字符串ksdlfnsdlfu893hdsvSFJSDgfsdk
。这record_name
也只是一个字符串,它实际上可以是任何东西,但它以前被过滤过,所以没有空格或特殊字符,大多数都是沿着这些线的东西this-is-the-name
。
随着名字的出现,每个人都应该至少找到一个记录,但我没有得到任何回报。我只是无法使用 mongo 来完成这些基本任务,如果有人可以提供帮助,将不胜感激。
我只是使用 nodeJS 并连接到 mongoDB,没有 express 或 mongoose 或类似的东西。
解决方案
这里的问题是你混合了异步代码处理的回调和承诺。你打电话时:
var record = db.collection('' + site_id + '_campaigns').find({name: record_name}).toArray(function(err, result) {
您正在传入一个回调函数,它将在一个名为 的参数中接收生成的 mongo 记录数组result
,然后将立即返回的值分配给一个名为“record”的变量,该变量不包含任何内容。
这是您的功能的清理版本。
function hit_the_db(db, site_id, record_name, callback) {
// Find all records matching 'record_name'
db.collection(site_id + 'test_campaigns').find({ name: record_name }).toArray(function(err, results) {
// matching records are now stored in 'results'
if (err) {
console.log('err:', err);
}
return callback(err, results);
});
}
这是用于测试上述功能的可选代码。
// This is called to generate test data
function insert_test_records_callback(db, site_id, record_name, insert_count, callback) {
const testRecords = [];
for (let i = 0; i < insert_count; ++i) {
testRecords.push({name: record_name, val: i});
}
db.collection(site_id + 'test_campaigns').insertMany(testRecords, function(err, result) {
return callback(err);
});
}
// This cleans up by deleting all test records.
function delete_test_records_callback(db, site_id, record_name, callback) {
db.collection(site_id + 'test_campaigns').deleteMany({name: record_name}, function(err, result) {
return callback(err);
});
}
// Test function to insert, query, clean up test records.
function test_callback(db) {
const site_id = 'ksdlfnsdlfu893hdsvSFJSDgfsdk';
const test_record_name = 'test_record_callback';
// First call the insert function
insert_test_records_callback(db, site_id, test_record_name, 3, function(err) {
// Once execution reaches here, insertion has completed.
if (err) {
console.log(err);
return;
}
// Do the query function
hit_the_db(db, site_id, test_record_name, function(err, records) {
// The query function has now completed
console.log('hit_the_db - err:', err);
console.log('hit_the_db - records:', records);
delete_test_records_callback(db, site_id, test_record_name, function(err, records) {
console.log('cleaned up test records.');
});
});
});
}
输出:
hit_the_db - err: null
hit_the_db - records: [ { _id: 5efe09084d078f4b7952dea8,
name: 'test_record_callback',
val: 0 },
{ _id: 5efe09084d078f4b7952dea9,
name: 'test_record_callback',
val: 1 },
{ _id: 5efe09084d078f4b7952deaa,
name: 'test_record_callback',
val: 2 } ]
cleaned up test records.