findOne () zwraca cały dokument, zamiast pojedynczego obiektu

głosy
0

Próbuję kwerendy tego zestawu danych za pomocą 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
}

Chcę wrócić pojedynczy obiekt z itemstablicy przy użyciu _Idjako filtr. To jak to robię, że:

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');      
    });
  };

Jednak console.log(item)zwraca cały dokument, tak jak poniżej:

{ 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 }

Chcę w końcu to wykorzystać, aby usunąć pojedyncze elementy, więc muszę filtr do pojedynczego obiektu z dokument podrzędny.

Utwórz 19/12/2018 o 14:20
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Jeśli chodzi o Twoje pytanie: MongoDB zawsze zwraca pełną obiekt pasujący zapytanie, chyba że dodasz określające występ, który powinien być zwrócony pola. Jeśli naprawdę chcą tylko wrócić zagnieżdżonego obiektu, można użyć rurociągu agregacji z operatorem $ replaceRoot tak:

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" },
 },
])

To powinno wrócić tylko poszukiwanych przedmiotów.

Uwaga jednak: Jeśli masz zamiar usunąć elementy z tablic czy inaczej, wolałbym proponuję przyjrzeć się działaniu $ ciągnącej, która może usunąć element z tablicy czy pasuje pewien warunek:

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

User.update(
  { 'wardrobe.items._id': "5c1a4b7d482bf501ed20ae4a"},
  { $pull: { 'wardrobe.items': {_id: "5c1a4b7d482bf501ed20ae4a"}},
  { multi: true }
)
Odpowiedział 19/12/2018 o 15:44
źródło użytkownik

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