javascript - Returnera vissa fält med .populate() från Mongoose


Jag får tillbaka ett JSON-värde från MongoDB efter att jag kör min fråga. Problemet är att jag inte vill returnera all JSON som är associerad med mitt svar, jag försökte söka i dokumentationen men hittade inget ordentligt sätt att göra detta på. Jag undrade om det är möjligt, och i så fall vad som är det rätta sättet att göra det. Exempel: I databasen

{
    user: "RMS",
    OS: "GNU/HURD",
    bearded: "yes",
    philosophy: {
        software: "FOSS",
        cryptology: "Necessary"
    },
    email: {
        responds: "Yes",
        address: "[email "
    },
    facebook: {}
}

{
    user: "zuckerburg",
    os: "OSX",
    bearded: "no",
    philosophy: {
        software: "OSS",
        cryptology: "Optional"
    },
    email: {},
    facebook: {
        responds: "Sometimes",
        address: "https://www.facebook.com/zuck?fref=ts"
    }
} 

Vad skulle vara det korrekta sättet att returnera ett fält om det finns för en användare, men om det inte finns returnera ett annat fält. För exemplet ovan skulle jag vilja returnera [email][address]-fältet för RMS och [facebook][address]-fältet för Zuckerburg. Detta är vad jag har försökt för att ta reda på om ett fält är null, men det verkar inte fungera.

 .populate('user' , `email.address`)
  .exec(function (err, subscription){ 
    var key;
    var f;
    for(key in subscription){
      if(subscription[key].facebook != null  ){
          console.log("user has fb");
      }
    }
  }

Svar #1

Jag är inte helt säker på vad du menar med "returnera ett fält", men du kan använda en lean()-fråga så att du fritt kan modifiera resultatet, sedan fylla i båda fälten och efterbearbeta resultatet för att bara behålla det fält du vill ha:

.lean().populate('user', 'email.address facebook.address')
  .exec(function (err, subscription){ 
    if (subscription.user.email.address) {
        delete subscription.user.facebook;
    } else {
        delete subscription.user.email;
    }
  });

Svar #2

Om du bara vill att några specifika fält ska returneras för de ifyllda dokumenten kan du åstadkomma detta genom att skicka fältnamnsyntaxen som det andra argumentet till populate-metoden.

Model
.findOne({ _id: 'bogus' })
.populate('the_field_to_populate', 'name') // only return the Persons name
...

Se Mongoose fylla i fältval

Svar #3

Försök att göra detta:

applicantListToExport: function (query, callback) {
  this
   .find(query).select({'advtId': 0})
   .populate({
      path: 'influId',
      model: 'influencer',
      select: { '_id': 1,'user':1},
      populate: {
        path: 'userid',
        model: 'User'
      }
   })
 .populate('campaignId',{'campaignTitle':1})
 .exec(callback);
}

Svar #4

Försök att göra detta:

User.find(options, '_id user email facebook').populate('facebook', '_id pos').exec(function (err, users) {

Svar #5

Nu kan du göra följande:

  .populate('friends', { username: 1, age: 1})

Svar #6

I följande fråga hämtade jag artiklar som matchar villkoret show=true de hämtade uppgifterna title och createdAt hämtar också kategorin för artikeln endast kategorins titel och dess id.

let articles = await articleModel
        .find({ show: true }, { title: 1, createdAt: 1 })
        .populate("category", { title: 1, _id: 1 });

Relaterade artiklar