MongoJS не удаляются по идентификатору

#javascript #node.js #mongodb #mongojs

#javascript #node.js #mongodb #mongojs

Вопрос:

  async deleteRecipeById(recipeId){
    try{
        const client = new MongoClient(this.uriString);
        
        await client.connect();
        const db = client.db(this.databaseString);
        const recipeCollection = db.collection(this.collectionString);

        //console.log(await recipeCollection.find({recipeName:recipeName}).toArray());
        var recipeIdAsObject = new ObjectId(recipeId);
        var result = recipeCollection.deleteMany({"_id":recipeIdAsObject});
        client.close();
        return resu<
    }
    catch(e){
        console.error(e);
    }
}
  

Я тестирую свой драйвер mongo, но никогда в жизни не смогу понять, почему это не работает. Я запускаю тот же тест с моим deleteRecipeByName() и тест проходит. Итак, для меня это показывает, что мое устройство для тестирования в порядке. Это означает, что я знаю, что рецепт существует в базе данных с правильным идентификатором.

Перед запуском теста я даже вызываю функцию getRecipeByName, которую я уже тестировал, чтобы убедиться, что рецепт существует с тем идентификатором, который я ищу, и это результат.

 [
{
  _id: 0,
  recipeName: 'mock0',
  recipeIngredients: [ 'i0', 'i1', 'i2' ]
}
]
  

И вот моя тестовая функция

 describe('Testing delete Recipe',()=>{
it('1. Delete known recipe',(done)=>{
    var uri = "mongodb://localhost:27017";
    var dbname = "testRecipes";
    var collectionName = "testCollectionMessy";
    let driver = new MongoDriver(uri,dbname,collectionName);
    driver.dropCollection().then(()=>{//Clean collection for testing... NEVER CALL ON PRODUCTION COLLECTION
        driver.addMockData().then((p)=>{
            driver.getRecipeById(mockData[0]._id).then((p)=>{
                console.log(p);
            })
            driver.deleteRecipeById(0).then((p)=>{
                console.log(p);
                console.log(mockData[0]._id);
                assert.deepEqual(p.deletedCount,1);
                done();
            }).catch((e)=>{
                console.log(e);
                done(e);
            })
        });
    }); 
})
})
  

и вот mockData, которые я импортирую из JSON

 [
 {"_id":0,"recipeName":"mock0","recipeIngredients":["i0","i1","i2"]},
 {"_id":1,"recipeName":"mock1","recipeIngredients":["i0","i1","i2"]},
 {"_id":2,"recipeName":"mock2","recipeIngredients":["ingredient"]}
]
  

Комментарии:

1. если вы запустите new ObjectId(recipeId) where recipeId is 0, 1 or 2 , это выдаст ошибку

2. Значит, у меня не может быть идентификаторов со значениями от 0-2?

3. Вам нужно избегать создания recipeIdAsObject и использования receipeId напрямую

4. Большое вам спасибо, это сработало. Мне нужно изменить мое тестовое устройство, поэтому я использую идентификаторы, которые больше похожи на мою производственную среду.

5. Добавлен ответ для поддержки обоих форматов

Ответ №1:

Проблема в том, как управляется receipeId.

new ObjectId(id) выдает ошибку, если идентификатор не является допустимым идентификатором объекта mongo, поэтому вы можете добавить фрагмент для управления обоими форматами следующим образом:

  async deleteRecipeById(recipeId){
    try{
        const client = new MongoClient(this.uriString);
        
        await client.connect();
        const db = client.db(this.databaseString);
        const recipeCollection = db.collection(this.collectionString);

        var recipeIdAsObject;
        if(/^(?=[a-fd]{24}$)(d [a-f]|[a-f] d)/i.test(recipeId)){
           recipeIdAsObject = new ObjectId(recipeId);
        } else {
           recipeIdAsObject = recipeId
        }

        var result = recipeCollection.deleteMany({"_id":recipeId});
        client.close();
        return resu<
    }
    catch(e){
        console.error(e);
        // it is dangerous to ignore errors
    }
}
  

Я бы посоветовал выбрать только один формат, иначе может быть сложно выполнять запросы в разных приложениях.

Комментарии:

1. Вау, огромное вам спасибо! Я борюсь с регулярными выражениями, поэтому я действительно ценю ваш вклад!