Удаление определенного поля в MongoDB

#javascript #mongodb #mongodb-query

#javascript #mongodb #mongodb-запрос

Вопрос:

Мои данные выглядят так:

 PHARMACY { 
    Name: "Walter", 
    City: "London" 
    UserQuestion: [
       { 
          text: "BlaBlaBla",
          type: "Prescription" 
       }, 
       { 
          text: "BlaBlaBla",
          type: "Medicine request"
       }, 
       { 
          text: "BlaBlaBla",
          type: "Prescription"
       } 
    ]
}
  

Я должен удалить из аптеки Уолтера только вопросы, касающиеся «типа рецепта» между несколькими вопросами, поэтому я должен логически удалить UserQuestion[0] и UserQuestion[2] .
Я попробовал этот код

 db.pharmacy.update({Name:"Walter"}, {$unset: {type:"Prescription"}} , {multi: true});
  

но не работает, поэтому я попробовал метод удаления

 db.pharmacy.remove({$and: [{Name:"Walter"}, {"UserQuestion.type":"Prescription} ] } );
  

Надеюсь, моя проблема понятна, спасибо.

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

1. Когда вы говорите «не работает» (что является бесполезным описанием проблемы), вы имеете в виду «не обновляет никаких документов», «вызывает ошибку» или что-то еще? И можете ли вы показать нам документы аптеки Schema ?

2. Я имею в виду, что это просто ничего не делает, поэтому в обоих случаях не обновляет никаких документов. Схема документа аптеки такова: КОЛЛЕКЦИЯ АПТЕКИ { ObjectId:{«…»} Имя: «Уолтер», Город: «Лондон», Вопрос пользователя {текст, тип}} Поэтому внутри коллекции аптеки есть вопросы

Ответ №1:

Вам нужно arrayFilters

Попробуйте выполнить этот запрос:

 db.collection.update({
  "Name": "Walter"
},
{
  "$unset": {
    "UserQuestions.$[af].type": ""
  }
},
{
  "arrayFilters": [
    {
      "af.type": "Prescription"
    }
  ],
  "multi": true
})
  

Этот запрос сначала находит элемент, соответствующий name . После этого удалите поле type , используя $unset для каждого элемента, соответствующего arrayFilter . И этот фильтр устанавливается чуть ниже. Мы используем те элементы, которые .type есть Prescription .

Пример здесь

Отредактируйте, чтобы объяснить, почему $ operator не работает:

Обратите внимание, что при использовании оператора position $ запрос не будет работать, поскольку, как объясняется в документации, этот оператор возвращает только первый элемент, соответствующий запросу. И вы хотите обновить каждый элемент в массив, который соответствует, а не только первый.

Пример, который здесь не работает, Обратите внимание, что только один объект удаляет поле type .

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

1. Большое вам спасибо, но я попробовал, и он обновляет 0 строк и не удаляет два вопроса

2. Я использовал нижний регистр в переменных. Убедитесь, что поля совпадают с вашими. Кстати, я обновлю поля до верхнего регистра, чтобы соответствовать вашему вопросу.

3. Я попробовал использовать свои поля, и в терминале отображается надпись «Обновлена существующая запись», но я не знаю, почему не удаляются пользовательские запросы с помощью типологии «Рецепт», они все еще там

4. Используете ли вы JS? Вызовы являются асинхронными, может быть, вы выводите значения до завершения обновления?

5. Приятно! Это хорошая новость. Также, если проблема решена, пометьте вопрос как принятый, приветствуется 🙂

Ответ №2:

Какой результат вы получили с

 db.pharmacy.update({Name:"Walter"}, {$unset: {type:"Prescription"}} , {multi: true});
  

Были ли какие-либо совпадения? Я предполагаю, что совпадения были, но обновлений не было.

Попробуйте это?

 db.pharmacy.update({"Name":"Walter"}, {$unset: {"UserQuestion.type":"Prescription"}} , {multi: true});

db.pharmacy.find({"UserQuestion.type":"Prescription"},{Name":1});
  

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

1. 1 существующая запись с этим кодом обновляется, но вопросы продолжают оставаться там, и их необходимо удалить из документа