2012-03-07 34 views
25

Tôi muốn truy xuất một số dữ liệu từ cài đặt Mongoose trong ứng dụng Node.js của tôi. Tôi nhận thấy rằng không có vấn đề gì tôi viết là lĩnh vực lựa chọn, tôi luôn luôn nhận được các lĩnh vực _id. Có cách nào không lấy nó? Đây là cách tôi làm ngay bây giờ:Mongoose truy xuất dữ liệu mà không có trường _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); 
}); 

Và ghi cho tôi những kết quả có chứa các lĩnh vực _id.

Trả lời

37

_id phải được loại trừ một cách cụ thể. Ví dụ,

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

Bạn có thể loại trừ _id và vẫn giữ id không? Tôi nhận thấy rằng id là một lĩnh vực ảo. Tôi muốn có id nhưng loại trừ _id trong api REST của tôi. Bây giờ, khi tôi loại trừ _id, id trở thành null – diokey

60

Một cách khác là sử dụng lý luận văn bản với tiền tố - đó sẽ loại trừ lĩnh vực này hoặc từ kết quả:

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

Điều này có vẻ là cú pháp thanh lịch hơn. – StephenT

+1

Vâng tốt hơn nhiều so với cái đầu tiên. Tốt nhất @VisioN – luxas

+1

Thanh lịch hơn nhiều! +1 – danilodeveloper

2

cách tiếp cận khác:

  • Tăng thêm .toJSON() của lược đồ xóa nó _id và các trường __v
  • Gọi .toJSON() trên tất cả các đối tượng DB được gửi đến khách hàng
  • Lợi ích bổ sung # 1: bạn có thể sử dụng item.id === 'something'typeof id === 'string', không ObjectId.
  • Lợi ích bổ sung # 2: Khi bạn có đối tượng gan từ khách hàng và bạn muốn tìm kiếm/cập nhật thì bạn không phải xóa thủ công _id vì không có, chỉ cần id bị bỏ qua.

làm tăng JSON:

mySchema.set('toJSON', { 
    virtuals: true, 
    transform: (doc, ret, options) => { 
     delete ret.__v; 
     ret.id = ret._id.toString(); 
     delete ret._id; 
    }, 
}); 

Vì vậy, bạn có thể sử dụng:

let item = (await MyCollection.findOne({/* search */}).exec()).toJSON(); 
if (item.id === 'someString') return item; 

Tôi biết đó là xấu xí. Nhưng đó là ý tưởng tồi tệ nhất mà tôi có cho đến nay.

Các vấn đề liên quan