Node.jsアプリケーションのMongoose設定からいくつかのデータを取得したいと思います。フィールド選択として何を書いても、常に_id
フィールドを取得することに気付きました。取得しない方法はありますか?これは私が今やっていることです:
Transaction.find({username : user.username}, ['uniqueId', 'timeout', 'confirmation_link', 'item_name'], function(err, txs){
console.log("user : " + user.username + " with txs: " + txs);
callback(txs);
});
_id
フィールドを含む結果をログに記録します。
_id
は特に除外する必要があります。例えば、
Transaction.find({username : user.username}, { '_id': 0, 'uniqueId' :1, 'timeout': 1, 'confirmation_link': 1, 'item_name': 1}, function(err, txs){
console.log("user : " + user.username + " with txs: " + txs);
callback(txs);
});
別の方法は、接頭辞-
を持つテキスト引数を使用することです。これにより、結果からこのフィールドまたはそのフィールドが除外されます。
Entity.find({ ... }, '-_id field1 field2', function(err, entity) {
console.log(entity); // { field1: '...', field2: '...' }
});
別のアプローチ:
_id
_および___v
_フィールドを削除するスキーマの.toJSON()
を追加します.toJSON()
を呼び出しますObjectId
ではなく_item.id === 'something'
_であるため、_typeof id === 'string'
_を使用できます。_id
_を手動で削除する必要はありません。無視されるのはid
だけなので。JSONの拡張:
_mySchema.set('toJSON', {
virtuals: true,
transform: (doc, ret, options) => {
delete ret.__v;
ret.id = ret._id.toString();
delete ret._id;
},
});
_
以下を使用できます。
_ let item = (await MyCollection.findOne({/* search */}).exec()).toJSON();
if (item.id === 'someString') return item;
_
私はそれがknowいことを知っています。しかし、これは私がこれまでに持っている最高の悪い考えです。
5.2.13バージョンのMongoose(2018年9月)-クエリビルダーアプローチを使用すると、同じものに変換できます
async function getUserDetails(user) {
try {
if (!user || !user.name) return;
const result = await Transaction.
find({username : user.username}).
select('uniqueId timeout confirmation_link item_name -_id');
// Adding minus sign before the _id (like -_id) in the select string unselects the _id which is sent by default.
console.log(result);
} catch(ex) {
return ex
}
}