首页 > 解决方案 > 如何查询 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 或类似的东西。

标签: node.jsmongodb

解决方案


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

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.

推荐阅读