Po uruchomieniu zapytania zwracana jest wartość JSON z MongoDB. Problem polega na tym, że nie chcę zwracać całego kodu JSON związanego z moim zwrotem, próbowałem przeszukać dokumenty i nie znalazłem właściwego sposobu, aby to zrobić. Zastanawiałem się, co jeśli jest to w ogóle możliwe, a jeśli tak, to jaki jest właściwy sposób na zrobienie tego. Przykład: w DB
{
user: "RMS",
OS: "GNU/HURD",
bearded: "yes",
philosophy: {
software: "FOSS",
cryptology: "Necessary"
},
email: {
responds: "Yes",
address: "[email protected]"
},
facebook: {}
}
{
user: "zuckerburg",
os: "OSX",
bearded: "no",
philosophy: {
software: "OSS",
cryptology: "Optional"
},
email: {},
facebook: {
responds: "Sometimes",
address: "https://www.facebook.com/zuck?fref=ts"
}
}
Jaki byłby właściwy sposób zwrócenia pola, jeśli istnieje ono dla użytkownika, ale nie zwraca innego pola. W powyższym przykładzie chciałbym zwrócić [email][address]
pole dla RMS i [facebook][address]
pole dla Zuckerburg. Oto, co próbowałem znaleźć, jeśli pole jest puste, ale wydaje się, że nie działa.
.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");
}
}
}
.populate('model', 'field')
,.populate('model', { field: 1})
,.populate('model', [field])
z lub bezlean()
oraz z i bezselectPopulatedPaths: false
modelu, ale ja zawsze mam pełną zaludnionych obiektu w odpowiedzi. Dokumentacja mówi, że twoja odpowiedź powinna być właściwa, ale nie mogę sprawić, by zadziałała. Czy ktoś ma ten sam problem?Jeśli chcesz, aby dla wypełnionych dokumentów było zwracanych tylko kilka określonych pól, możesz to zrobić, przekazując składnię nazwy pola jako drugi argument do metody wypełniania.
Model .findOne({ _id: 'bogus' }) .populate('the_field_to_populate', 'name') // only return the Persons name ...
Zobacz Mongoose wypełnianie wyboru pól
źródło
Spróbuj to zrobić:
User.find(options, '_id user email facebook').populate('facebook', '_id pos').exec(function (err, users) {
źródło
Spróbuj to zrobić:
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); }
źródło
Teraz możesz:
.populate('friends', { username: 1, age: 1})
źródło
do spróbowania:
Post.find({_id: {$nin: [info._id]}, tags: {$in: info.tags}}).sort({_id:-1}) .populate('uid','nm') .populate('tags','nm') .limit(20).exec();
źródło
Aby uzupełnić powyższe odpowiedzi, jeśli chcesz uwzględnić wszystko, ale tylko wykluczyć określone atrybuty , możesz wykonać następujące czynności:
.populate('users', {password: 0, preferences: 0})
źródło
Cześć, dla mnie zadziałało. Wypełniłem pole użytkownika przy użyciu kodu wypełnienia: --->
async function displayMessage(req,res,next){ try{ let data= await Msg.find().populate("user","userName userProfileImg","User") if(data===null) throw "Data couldn ot be loaded server error" else { res.status(200).json(data) } } catch(err){ next(err) } }
otrzymuję bezpośrednio wynik. Tutaj pola nazwa_użytkownika, obraz profilu użytkownika są tymi, które są wymagane selektywnie, a składnia wypełniania jest następująca: ->
.populate("user field to populate","fields to display with spaces between each of them " , "modelName ")
każdy parametr powinien być zapisany w cudzysłowie.
Poniżej znajduje się wynik, który otrzymałem. Jeszcze jedna rzecz, której nie musisz się martwić o wypełnienie identyfikatora pod-dokumentu, który otrzymasz automatycznie.
[ { "_id": "5e8bff324beaaa04701f3bb9", "text": "testing message route", "user": { "_id": "5e8bf062d3c310054cf9f293", "userName": "boss", "userProfileImg": "img" }, "__v": 0 }, { "_id": "5e8bff8dd4368a2858e8f771", "text": "testing message route second", "user": { "_id": "5e8bf062d3c310054cf9f293", "userName": "boss", "userProfileImg": "img" }, "__v": 0 }, { "_id": "5e8c0c08e9bdb8209829176a", "text": "testing message route second", "user": { "_id": "5e8bf062d3c310054cf9f293", "userName": "boss", "userProfileImg": "img" }, "__v": 0 }, { "_id": "5e8c0e0bcb63b12ec875962a", "text": "testing message route fourth time", "user": { "_id": "5e8bf062d3c310054cf9f293", "userName": "boss", "userProfileImg": "img" }, "__v": 0 } ]
źródło
W poniższym zapytaniu pobrałem artykuły spełniające warunek,
show=true
pobrane danetitle and createdAt
również pobieram kategorię artykułu tylko tytuł kategorii i jej identyfikator.let articles = await articleModel .find({ show: true }, { title: 1, createdAt: 1 }) .populate("category", { title: 1, _id: 1 });
źródło
możesz spróbować użyć poniżej,
Model .find() .populate({path: 'foreign_field', ['_id', 'name']}) // only return the Id and Persons name ...
źródło