Push items in mongo-array via mangoest

Eigenlijk heb ik een mongodb-verzameling genaamd ‘people’
wiens schema als volgt is:

people: {
         name: String, 
         friends: [{firstName: String, lastName: String}]
        }

Nu heb ik een zeer eenvoudige express-toepassing die verbinding maakt met de database en met succes ‘mensen’ maakt met een lege vriendenarray.

Op een secundaire plaats in de applicatie is er een formulier om vrienden toe te voegen. Het formulier bevat voornaam en achternaam en vervolgens POST’s met het naamveld, ook voor verwijzing naar het juiste personenobject.

Waar ik moeite mee heb, is een nieuw friend-object maken en dit vervolgens in de friends-array “pushen”.

Ik weet dat wanneer ik dit via de mongo-console doe, ik de update-functie gebruik met $pushals mijn tweede argument na de opzoekcriteria, maar ik kan de juiste manier niet vinden om laat mangoest dit doen.

db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});

Antwoord 1, autoriteit 100%

Ervan uitgaande dat var friend = { firstName: 'Harry', lastName: 'Potter' };

Je hebt twee opties:

Werk het model in het geheugen bij en sla het op (plain javascript array.push):

person.friends.push(friend);
person.save(done);

of

PersonModel.update(
    { _id: person._id }, 
    { $push: { friends: friend } },
    done
);

Ik probeer altijd voor de eerste optie te gaan als dat mogelijk is, omdat het meer van de voordelen respecteert die mangoest je geeft (haken, validatie, enz.).

Als u echter veel gelijktijdige schrijfbewerkingen uitvoert, krijgt u te maken met race-omstandigheden waarin u vervelende versiefouten krijgt, zodat u niet elke keer het hele model hoeft te vervangen en de vorige vriend die u hebt toegevoegd, kwijtraakt. Ga dus alleen naar de eerste als het absoluut noodzakelijk is.


Antwoord 2, autoriteit 16%

De $push-operator voegt een gespecificeerd waarde toe aan een array.

{ $push: { <field1>: <value1>, ... } }

$pushvoegt het arrayveld toe met de waarde als zijn element.

Bovenstaand antwoord voldoet aan alle vereisten, maar ik heb het werkend gekregen door het volgende te doen

var objFriends = { fname:"fname",lname:"lname",surname:"surname" };
Friend.findOneAndUpdate(
   { _id: req.body.id }, 
   { $push: { friends: objFriends  } },
  function (error, success) {
        if (error) {
            console.log(error);
        } else {
            console.log(success);
        }
    });
)

Antwoord 3, autoriteit 5%

Gebruik $pushom het document bij te werken en een nieuwe waarde in een array in te voegen.

vind:

db.getCollection('noti').find({})

resultaat voor vondst:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 1.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0
}

bijwerken:

db.getCollection('noti').findOneAndUpdate(
   { _id: ObjectId("5bc061f05a4c0511a9252e88") }, 
   { $push: { 
             graph: {
               "date" : ISODate("2018-10-24T08:55:13.331Z"),
               "count" : 3.0
               }  
           } 
   })

resultaat voor update:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 1.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 3.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0
}

Antwoord 4, autoriteit 3%

Een andere manier om items in een array te pushen met Mongoose is- $addToSet, als je wilt dat alleen unieke items in de array worden gepusht. De operator $pushvoegt het object eenvoudig toe aan de array, ongeacht of het object al aanwezig is, terwijl $addToSetdat alleen doet als het object niet in de array aanwezig is, zodat er geen om dubbelzinnigheid op te nemen.

PersonModel.update(
  { _id: person._id }, 
  { $addToSet: { friends: friend } }
);

Hiermee wordt gezocht naar het object dat u aan de array toevoegt. Indien gevonden, doet niets. Als dat niet het geval is, voegt u het toe aan de array.

Referenties:


Antwoord 5, autoriteit 2%

Eerst probeerde ik deze code

const peopleSchema = new mongoose.Schema({
  name: String,
  friends: [
    {
      firstName: String,
      lastName: String,
    },
  ],
});
const People = mongoose.model("person", peopleSchema);
const first = new Note({
  name: "Yash Salvi",
  notes: [
    {
      firstName: "Johnny",
      lastName: "Johnson",
    },
  ],
});
first.save();
const friendNew = {
  firstName: "Alice",
  lastName: "Parker",
};
People.findOneAndUpdate(
  { name: "Yash Salvi" },
  { $push: { friends: friendNew } },
  function (error, success) {
    if (error) {
      console.log(error);
    } else {
      console.log(success);
    }
  }
);

Maar ik merkte dat alleen de eerste vriend (dwz Johhny Johnson) wordt opgeslagen en het doel om het array-element in een bestaande array van “vrienden” te pushen lijkt niet te werken, zoals wanneer ik de code uitvoer, in de database in alleen shows ” Eerste vriend” en “vrienden” array heeft slechts één element!
Dus de eenvoudige oplossing staat hieronder

const peopleSchema = new mongoose.Schema({
  name: String,
  friends: [
    {
      firstName: String,
      lastName: String,
    },
  ],
});
const People = mongoose.model("person", peopleSchema);
const first = new Note({
  name: "Yash Salvi",
  notes: [
    {
      firstName: "Johnny",
      lastName: "Johnson",
    },
  ],
});
first.save();
const friendNew = {
  firstName: "Alice",
  lastName: "Parker",
};
People.findOneAndUpdate(
  { name: "Yash Salvi" },
  { $push: { friends: friendNew } },
  { upsert: true }
);

Het toevoegen van “{UPSERT: TRUE}” SOLVED-probleem in mijn geval en zodra code wordt opgeslagen en ik voer het uit, zie ik dat “vrienden” -array nu 2 elementen heeft!
The UpSert = True-optie creëert het object als het niet bestaat. Standaard is ingesteld op FALSE.

Als het niet werkt, gebruik dan onderstaande fragment

People.findOneAndUpdate(
  { name: "Yash Salvi" },
  { $push: { friends: friendNew } },
).exec();

Antwoord 6

Een eenvoudige manier om dat te doen, is om het volgende te gebruiken:

var John = people.findOne({name: "John"});
John.friends.push({firstName: "Harry", lastName: "Potter"});
John.save();

Antwoord 7

In mijn geval deed ik dit

 const eventId = event.id;
  User.findByIdAndUpdate(id, { $push: { createdEvents: eventId } }).exec();

Antwoord 8

Ik kwam ook in dit probleem. Mijn fix was om een ​​kindschema te creëren. Zie hieronder voor een voorbeeld voor uw modellen.

—- persoonmodel

const mongoose = require('mongoose');
const SingleFriend = require('./SingleFriend');
const Schema   = mongoose.Schema;
const productSchema = new Schema({
  friends    : [SingleFriend.schema]
});
module.exports = mongoose.model('Person', personSchema);

***Belangrijk: SingleFriend.schema -> zorg ervoor dat je kleine letters gebruikt voor schema

— Kinderschema

const mongoose = require('mongoose');
const Schema   = mongoose.Schema;
const SingleFriendSchema = new Schema({
  Name: String
});
module.exports = mongoose.model('SingleFriend', SingleFriendSchema);

Other episodes