2012-03-07 15 views
25

Node.jsアプリケーションのMongoose設定からいくつかのデータを取得したいと思います。フィールドの選択として何を書いても、私は常に_idフィールドを取得することに気付きました。それをフェッチしない方法はありますか? これが今の私が行う方法です。_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フィールドを含む結果をログに記録します。

答えて

37

_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); 
}); 
+2

あなたは_idを除外でき、まだIDを保持できますか?私はIDが仮想フィールドであることに気づいた。私はIDを持っていますが、REST APIで_idを除外したいと思います。今のところ、_idを除外すると、idはnullになります – diokey

60

もう一つの方法は、その結果から、このまたはそのフィールドを除外れるプレフィックス-でテキスト引数を使用することです:

Entity.find({ ... }, '-_id field1 field2', function(err, entity) { 
    console.log(entity); // { field1: '...', field2: '...' } 
}); 
+1

これはより洗練された構文です。 – StephenT

+1

最初のものよりはるかに優れています。良いもの@VisioN – luxas

+1

もっとエレガント! +1 – danilodeveloper

2

別のアプローチ:

  • .toJSON()を強化します_idフィールドと__vフィールドを削除するスキーマの
  • クライアントに送信されるすべてのDBオブジェクトで.toJSON()を呼び出してください。
  • item.id === 'something'item.id === 'something'ObjectIdではなく、item.id === 'something'を使用できます。
  • 追加の利点#2:クライアントからganオブジェクトを戻して、検索/更新したい場合は、_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; 

。しかし、それは私がこれまでに持っていた最高の悪い考えです。

関連する問題