Nodejs mongodb 删除的时候不用主键

Nodejs mongodb 删除的时候不用主键

var uId=1; var sId=2; collection.remove({userId:uId,shareId:sId},function(err,count){ }) userId,shareId没有用到mongodb自己生成的_id,自己另外定义的 这么删除数据的时候为什么删不掉,我把条件改成{userId:1,shareId:2}就删掉了,这是哪里的问题啊

2 回复

Node.js MongoDB 删除的时候不用主键

在使用 MongoDB 进行数据操作时,经常会遇到需要根据自定义字段而不是默认的 _id 字段来删除文档的情况。你所遇到的问题可能是因为查询条件没有正确匹配到任何文档。让我们来看一下具体的示例代码,并分析问题所在。

示例代码

假设我们有一个集合 shares,其中每个文档包含 userIdshareId 字段。现在我们要根据这两个字段来删除文档。

const MongoClient = require('mongodb').MongoClient;

// 连接到 MongoDB
MongoClient.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true })
    .then(client => {
        console.log('Connected to Database');
        const db = client.db('mydatabase');
        const collection = db.collection('shares');

        // 定义要删除的数据的条件
        const uId = 1;
        const sId = 2;

        // 使用自定义字段删除文档
        collection.deleteMany({ userId: uId, shareId: sId }, (err, result) => {
            if (err) {
                return console.error(err);
            }
            console.log(`Removed ${result.deletedCount} documents`);
            client.close();
        });
    })
    .catch(error => console.error(error));

分析问题

在你的原始代码中,你使用了 collection.remove() 方法,而现代的 MongoDB 驱动程序推荐使用 deleteOne()deleteMany() 方法。以下是可能的原因:

  1. 查询条件错误:确保 userIdshareId 的值与数据库中的实际值完全匹配。
  2. 数据类型:确保 userIdshareId 的数据类型与数据库中的数据类型一致。例如,如果数据库中的 userId 是字符串类型,而你在代码中使用数字类型,则会导致查询失败。
  3. 索引问题:如果 userIdshareId 没有被索引,查询可能会变慢或根本找不到任何文档。

解决方案

  1. 检查数据:确保 userIdshareId 的值与数据库中的实际值完全匹配。
  2. 类型一致性:确保所有字段的数据类型一致。
  3. 添加索引:可以考虑为 userIdshareId 添加索引以提高查询性能。
db.collection('shares').createIndex({ userId: 1, shareId: 1 });

通过这些步骤,你应该能够成功地根据自定义字段删除文档。希望这能解决你的问题!


在 MongoDB 中,remove 方法(现在推荐使用 deleteManydeleteOne)根据传入的查询条件来删除文档。如果你定义了其他字段(如 userIdshareId)作为删除条件,并且这些字段存在相应的值,理论上应该能够成功删除匹配条件的文档。

如果 userIdshareId 没有正确地匹配到任何文档,那么删除操作自然会失败。这可能是因为以下几种原因:

  1. 数据不存在:确保数据库中确实存在 userId 为 1 且 shareId 为 2 的文档。
  2. 数据类型不匹配:确保你在查询条件中使用的数据类型与数据库中的数据类型完全一致。例如,如果 userId 是字符串类型而不是数字类型,则需要将 uId 转换为字符串。

以下是检查和删除文档的示例代码:

const MongoClient = require('mongodb').MongoClient;

async function deleteDocument() {
    const uri = "your_mongodb_connection_string";
    const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });

    try {
        await client.connect();
        const database = client.db('your_database_name');
        const collection = database.collection('your_collection_name');

        // 确保 uId 和 sId 的类型与数据库中的一致
        const uId = 1; // 或者 '1',取决于数据库中的类型
        const sId = 2; // 或者 '2',取决于数据库中的类型

        // 查询是否有匹配的文档
        const query = { userId: uId, shareId: sId };
        const result = await collection.findOne(query);

        if (result) {
            console.log("文档存在,准备删除...");
            const deleteResult = await collection.deleteOne(query);
            console.log(`已删除 ${deleteResult.deletedCount} 个文档`);
        } else {
            console.log("未找到匹配的文档");
        }
    } catch (err) {
        console.error("发生错误:", err);
    } finally {
        await client.close();
    }
}

deleteDocument().catch(console.error);

这段代码首先连接到 MongoDB 数据库,然后查询是否存在匹配的文档。如果存在,它会执行删除操作并输出结果。如果不存在,它会输出一条提示信息。这样可以确保你不会意外删除不存在的数据。

回到顶部