Как удалить объект из массива JS в MongoDB с помощью Mon goose? - PullRequest
0 голосов
/ 18 июня 2020

В этом примере я хочу удалить объект из массива ответов, текстовое поле которого совпадает с тем, которое я передал в запросе. Это моя схема для модели QAns:

const QuestAnsSchema = new Schema({
        text: String,
        author_id: String,
        author_name: String,
        answered: Boolean,
        answers: [{
            text: String,
            author_id: String,
            author_name: String,
        }]
    });

И это данные в базе данных

{
    "_id":{
            "$oid":"5ee7########989ca"
          },
    "text":"hyfffffff",
    "author_id":"5ee749##########8081e",
    "author_name":"Gamerz One",
    "answered":false,
    "answers":[],
    "__v":{"$numberInt":"0"}
},

{
    "_id":
    {
    "$oid":"5ee767ee8b57ee30e0dadac8"
    },
    "text":"What is your name?",
    "author_id":"5ee749b44c3d1d13cc08081e",
    "author_name":"Gamerz One",
    "answered":true,
    "answers":[
        {
            "_id":
                    {
                        "$oid":"5ee8ec9a68698c2d1cb4e043"
                    },
            "text":"My name is gamerz\r\n",
            "author_id":"5ee1b8ebdbf91b23a808d417",
            "author_name":"Gamerz One"
        },  
        {
            "_id":
                    {
                        "$oid":"5eea07f832d091080cc047f2"
                    },
            "text":"my name is kunal nalaawde",
            "author_id":"5ee749b44c3d1d13cc08081e",
            "author_name":"Gamerz One"
        }
    ],
    "__v":{"$numberInt":"6"}
 }

Существует целый документ, содержащий объект QAns, который имеет массив ответов внутри их. Теперь я хочу удалить один объект из массива ответов, относящийся к конкретному вопросу. Например, из приведенных выше данных я хочу удалить ответ «Меня зовут gamerz» из вопроса «Как тебя зовут?», Передав текст ответа в запросе.

Я пробовал этот код, но он не работает

QAns.findOneAndUpdate({ text: questionText }, { $pull: { answers: { text: ansText} }  })
    .then((result,err) => {
        if (err)  console.log(err)
        else      console.log(result)
    })
  • QAns - это название модели
  • questionText - это текст вопроса, ответ на который предполагается удалить
  • ansText - это текст ответа, а объект, содержащий этот текст, предполагается удалить из массива ответов вопроса

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Все вроде правильно. Убедитесь, что вы получаете обновленную версию документа, используя параметр new: true .

QAns.findOneAndUpdate({ text: questionText }, { $pull: { answers: { text: ansText} } }, {new: true})
.then((result,err) => {
    if (err)  console.log(err)
    else      console.log(result)
})
0 голосов
/ 18 июня 2020

Вы можете сопоставить тексты с помощью текстового поиска без учета регистра. $regex работает как оператор LIKE в SQL. а $options: 'i' делает поиск нечувствительным к регистру.

QAns.findOneAndUpdate({ text: questionText }, { $pull: { answers: { text:{'$regex': ansText, '$options': 'i'}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...