FindOne () gibt gesamte Dokument, anstelle eines einzigen Objektes

stimmen
0

Ich versuche , diesen Satz von Daten abfragen mit findOne():

{
    _id: {
        $oid: 5c1a4ba1482bf501ed20ae4b
    },
    wardrobe: {
        items: [
            {
                type: T-shirt,
                colour: Gray,
                material: Wool,
                brand: Filson,
                _id: 5c1a4b7d482bf501ed20ae4a
            },
            {
                type: T-shirt,
                colour: White,
                material: Acrylic,
                brand: H&M,
                _id: 5c1a4b7d482bf501ed20ae4a
            }
        ]
    },
    tokens: [],
    email: another@new.email,
    password: $2a$10$quEXGjbEMX.3ERdjPabIIuMIKu3zngHDl26tgRcCiIDBItSnC5jda,
    createdAt: {
        $date: 2018-12-19T13:46:09.365Z
    },
    updatedAt: {
        $date: 2018-12-19T13:47:30.123Z
    },
    __v: 2
}

Ich möchte ein einzelnes Objekt aus dem zurück itemsArray _Idals Filter. Dies ist , wie ich tue , dass:

exports.deleteItem = (req, res, next) => {
    User.findOne({ 'wardrobe.items': { $elemMatch: { _id: 5c1a4b7d482bf501ed20ae4a,} } }, (err, item) => {
    console.log(item);
    if (err) {
        return console.log(error:  + err);
        }
        res.redirect('/wardrobe');      
    });
  };

Allerdings console.log(item)gibt das gesamte Dokument-etwa so:

{ wardrobe: { items: [ [Object], [Object] ] },
  tokens: [],
  _id: 5c1a4ba1482bf501ed20ae4b,
  email: 'another@new.email',
  password:
   '$2a$10$quEXGjbEMX.3ERdjPabIIuMIKu3zngHDl26tgRcCiIDBItSnC5jda',
  createdAt: 2018-12-19T13:46:09.365Z,
  updatedAt: 2018-12-19T13:47:30.123Z,
  __v: 2 }

Ich möchte dies schließlich verwenden, um einzelne Elemente zu löschen, also muß ich aus der Subdokument zum einzelnen Objekt filtern.

Veröffentlicht am 19/12/2018 um 14:20
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

In Bezug auf Ihre Frage: MongoDB immer gibt das vollständige Objekt Ihre Suche entspricht, es sei denn Du eine Projektion Spezifizierungs hinzufügen, die Felder zurückgegeben werden sollen. Wenn Sie wirklich wollen, um nur ein verschachteltes Objekt zurückgeben, könnten Sie die Aggregation Pipeline mit dem $ replaceRoot Operator wie folgt verwenden:

User.aggregate([
 // you can directly query for array fields instead of $elemMatching them
 { $match: { 'wardrobe.items._id': "5c1a4b7d482bf501ed20ae4a"}}},
 // this "lifts" the fields wardrobe up and makes it the new root
 { $replaceRoot: {newRoot: '$wardrobe'}
 // this "splits" the array into separate objects
 { $unwind: '$items'},
 // this'll remove all unwanted elements
 { $match: { 'items._id': "5c1a4b7d482bf501ed20ae4a" },
 },
])

Dies sollte nur die gewünschten Artikel zurückgeben.

Ein Hinweis allerdings: Wenn Sie sowieso Elemente von Arrays zu entfernen, würde ich eher vorschlagen, dass Sie einen Blick auf dem $ Zugbetrieb haben, die ein Element aus einem Array entfernen können, wenn sie eine bestimmte Bedingung erfüllt:

https://docs.mongodb.com/manual/reference/operator/update/pull/

User.update(
  { 'wardrobe.items._id': "5c1a4b7d482bf501ed20ae4a"},
  { $pull: { 'wardrobe.items': {_id: "5c1a4b7d482bf501ed20ae4a"}},
  { multi: true }
)
Beantwortet am 19/12/2018 um 15:44
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more