Node.js 如何查询mongoDB以查看匹配的记录是否存在,以及它是否返回更新

Node.js 如何查询mongoDB以查看匹配的记录是否存在,以及它是否返回更新,node.js,mongodb,Node.js,Mongodb,这似乎是一项非常基本的任务,但我就是无法实现(对mongo或nodeJS不是很有经验) 我有一系列的记录。我需要检查数据库,看看是否已经存在任何具有匹配名称的记录,以及它们是否抓取了该记录,以便我可以更新它 现在我正在尝试这个 function hit_the_db(db, record_name, site_id) { return new Promise((resolve, reject) => { var record = db.collection('' + site_

这似乎是一项非常基本的任务,但我就是无法实现(对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
只是一个看起来像
ksdlfnsdlfru893hdsvsfjsdgfsdk
的字符串。
record\u name
也只是一个字符串,它实际上可以是任何东西,但它之前经过过滤,因此没有空格或特殊字符,大多数是沿着这些行的内容
这是名称

随着名字通过,应该有至少一个找到的每个记录,但我没有得到任何回报。我就是不能用mongo来完成这些基本任务,如果有人能帮忙,我将不胜感激


我只是使用nodeJS并连接到mongoDB,没有express或mongoose之类的东西。

这里的问题是,您混合了回调和异步代码处理的承诺。当你打电话时:

var record = db.collection('' + site_id + '_campaigns').find({name: record_name}).toArray(function(err, result) {
您正在传入一个回调函数,该函数将在名为
result
的参数中接收生成的mongo记录数组,但随后将立即返回的值分配给名为“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.');
            });
        });
    });
}
下面是测试上述函数的可选代码

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.');
            });
        });
    });
}

我不明白为什么第一个示例被放在一个
insertOne
调用中,它不插入,不是吗?为什么我必须运行一个
insertOne
来检索一条记录,这是不对的,我是否遗漏了什么?你是对的,它通常不需要它。我想用插入和查询来显示一个完整的测试。当我从内部删除代码时,它就不起作用了。我需要一个符合我在问题中指定的标准的例子。我非常感谢你抽出时间回答。感谢againI删除了异步示例,使回调示例更接近您的原始代码,并添加了一个具有多条记录的测试。因此,我对mongo和nodeJS非常陌生,所以我只想问一下,很明显,我非常感谢您在这方面的帮助。我真的需要4个函数和近50行代码来查询数据库中的匹配记录并在找到时更新它吗?如果是这样的话,我想我可能会把mongo和node一起放在这里。