Как получить конкретный элемент внутри массива внутри коллекции пользователей, созданной с помощью мангуста?

#node.js #mongodb #express #mongoose

Вопрос:

 // database: db.getCollection('users').find({})

{
    "_id" : ObjectId("60af81e943d991265c2b8746"),
    "email" : "test@gmail.com.com",
    "password" : "123456",
    "notes" : [ 
        {
            "_id" : ObjectId("60af81e943d991265c2b8747"),
            "title" : "test title",
            "content" : "test content"
        }
    ],
    "__v" : 0
}

// userSchema

const userSchema = new mongoose.Schema({
  email: String,
  password: String,
  notes: [{ title: String, content: String }],
});
 

///////////////////////////////////////////////////////////////////////////////////

 app.post("/save", function (req, res) {

  const idNote = req.body._id;

  const userID = req.user._id;

  User.findById({ _id: userID }, function (err, foundUser) {
    if (err) {
      console.log(err);
    } else {
      const notesArray = foundUser.notes;
     }
    }

      console.log(notesArray);
    })
  });
 

Итак, есть ли способ получить конкретные (примечания._id внутри пользователя._id) и использовать его для запроса документа(чтобы я мог найти конкретную «заметку» внутри пользователя) или единственный способ, которым работает запрос, — это поиск коллекции, в которой единственные реквизиты, которые можно использовать для запроса документа, находятся внутри схемы?

Если я тогда прав…

 const newTitle = req.body.title;
const newContent = req.body.content;
const userID = req.user._id;

User.findById({ _id: userID }, function (err, foundUser) {
    if (err) {
      console.log(err);
    } else {
      const notesArray = foundUser.notes;

      const note = findNote(editNote, notesArray);

      function findNote(editNote, notesArray) {
        for (let i = 0; i < notesArray.length; i  ) {
          if (notesArray[i]._id == editNote) {
            return notesArray[i];
          } else {
            console.log("not found!");
          }
        }
      }

      console.log(note);

    }
  });
 

Как я могу удалить «заметку», которую мне нужно отредактировать, а затем создать НОВУЮ ВЕСЬ остальной массив и в итоге вставить новый массив заметок в схему «заметки»:[],

 {
    "_id" : ObjectId("60af81e943d991265c2b8746"),
    "email" : "test@gmail.com.com",
    "password" : "123456",
    "notes" : --> HERE <--,
    "__v" : 0
}
 

Ответ №1:

Если я правильно понимаю ваш вопрос, вы хотите добавить/удалить/отредактировать note объект в notes массиве определенного пользовательского свойства. Вы можете выполнить любое из них всего одним запросом.

Добавить новый элемент

Если вы хотите добавить новый элемент в notes массив для определенного пользователя, вы можете сделать это с $push помощью оператора, например:

 db.collection.update({
  "_id": "user_1"
},
{
  "$push": {
    "notes": {
      "_id": "note_5",
      "title": "test title",
      "content": "test content"
    }
  }
})
 

Вот рабочий пример: https://mongoplayground.net/p/AvRjSKZxNt7

Удалить элемент

Если вы хотите удалить элемент из notes массива для определенного пользователя, вы можете сделать это с помощью $pull оператора, например:

 db.collection.update({
  "_id": "user_1"
},
{
  "$pull": {
    "notes": {
      "_id": "note_4" 
    }
  }
})
 

Вот рабочий пример: https://mongoplayground.net/p/M_gS2T00PDS

Изменить элемент

Если вы хотите отредактировать элемент из notes массива для определенного пользователя, вы можете сделать это с помощью
позиционный оператор»$», вот так:

 db.collection.update({
  "_id": "user_1",
  "notes._id": "note_4"
},
{
  "$set": {
    "notes.$.title": "This is new title"
  }
})
 

Вот рабочий пример: https://mongoplayground.net/p/Gn9R5u2rBJd