Przeszukałem TAK trochę, szukając odpowiedzi, ale jestem pewien, że brakuje mi odpowiednich słów, aby opisać, czego szukam.
Zasadniczo mam kolekcję mongodb o nazwie „people”. Schemat tej kolekcji jest następujący:
people: {
name: String,
friends: [{firstName: String, lastName: String}]
}
Teraz mam bardzo podstawową aplikację ekspresową, która łączy się z bazą danych i pomyślnie tworzy „ludzi” z pustą tablicą znajomych.
W drugorzędnym miejscu w aplikacji znajduje się formularz do dodawania znajomych. Formularz przyjmuje nazwy firstName i lastName, a następnie POST z polem nazwy również w celu odniesienia do odpowiedniego obiektu osób.
Trudno mi jest stworzyć nowy obiekt przyjaciela, a następnie „wypchnąć” go do tablicy znajomych.
Wiem, że kiedy robię to za pomocą konsoli mongo, używam funkcji aktualizacji z $ push jako drugim argumentem po kryteriach wyszukiwania, ale nie mogę znaleźć odpowiedniego sposobu, aby zmusić mongoose do zrobienia tego.
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
AKTUALIZACJA: Więc odpowiedź Adriana była bardzo pomocna. Oto, co zrobiłem, aby osiągnąć swój cel.
w moim pliku app.js ustawiłem trasę tymczasową za pomocą
app.get('/addfriend', users.addFriend);
gdzie w moim pliku users.js mam
exports.addFriend = function (req, res, next)
{
var friend = {"firstName": req.body.fName, "lastName": req.body.lName};
Users.findOneAndUpdate({name: req.user.name}, {$push: {friends: friend}});
};
Odpowiedzi:
Zarozumiały,
var friend = { firstName: 'Harry', lastName: 'Potter' };
Masz do wyboru dwie opcje:
Zaktualizuj model w pamięci i zapisz (zwykły javascript array.push):
lub
Zawsze staram się wybierać pierwszą opcję, jeśli to możliwe, ponieważ będzie ona szanować więcej korzyści, jakie daje mangusta (haczyki, walidacja itp.).
Jeśli jednak wykonujesz wiele równoczesnych zapisów, napotkasz warunki wyścigu, w których skończysz z paskudnymi błędami wersji, aby powstrzymać cię przed zamianą całego modelu za każdym razem i utratą poprzedniego dodanego znajomego. Więc idź do tego pierwszego tylko wtedy, gdy jest to absolutnie konieczne.
źródło
update
funkcję, a to NIE JEST bezpieczne znaleźć dokument, modyfikować je w pamięci, a następnie wywołać.save()
metodę na dokumencie. Kiedy mówię, że operacja jest „bezpieczna”, oznacza to, że nawet jeśli jedna, dwie lub 50 zmian jest wprowadzanych do dokumentu, wszystkie zostaną pomyślnie zastosowane, a aktualizacje będą działać zgodnie z oczekiwaniami. Zasadniczo manipulacja w pamięci jest niebezpieczna, ponieważ możesz pracować nad nieaktualnym dokumentem, więc po zapisaniu zmiany, które nastąpiły po kroku pobierania, zostaną utracone.let done = function(err, result) { // this runs after the mongoose operation }
Powyższa odpowiedź spełnia wszystkie wymagania, ale udało mi się to, wykonując następujące czynności
źródło
Służy
$push
do aktualizowania dokumentu i wstawiania nowej wartości do tablicy.odnaleźć:
wynik dla znalezienia:
aktualizacja:
wynik do aktualizacji:
źródło
Prostym sposobem na to jest użycie:
źródło
W moim przypadku to zrobiłem
źródło
Natknąłem się również na ten problem. Moją poprawką było utworzenie schematu potomnego. Zobacz poniżej przykład dla swoich modeli.
---- Model osoby
*** Ważne: SingleFriend.schema -> upewnij się, że w schemacie używasz małych liter
--- Schemat podrzędny
źródło