Node.js 在mongodb中获取属性的结果作为数组而不是文档

Node.js 在mongodb中获取属性的结果作为数组而不是文档,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个模式为的用户集合 { name: String, books: [ id: { type: Schema.Types.ObjectId, ref: 'Book' } , name: String ] } 是否可以获取书籍ID数组而不是对象 比如: ["53eb797a63ff0e8229b4aca1", "53eb797a63ff0e8229b4aca2", "53eb797a63ff0e8229b4aca3"]

我有一个模式为的用户集合

{
     name: String, 
     books: [
         id: { type: Schema.Types.ObjectId, ref: 'Book' } ,
         name: String
     ]


}
是否可以获取书籍ID数组而不是对象

比如:

["53eb797a63ff0e8229b4aca1", "53eb797a63ff0e8229b4aca2", "53eb797a63ff0e8229b4aca3"]

而不是

{
    _id: ObjectId("53eb79d863ff0e8229b97448"),
    books:[
        {"id" : ObjectId("53eb797a63ff0e8229b4aca1") }, 
        { "id" : ObjectId("53eb797a63ff0e8229b4acac") }, 
        { "id" : ObjectId("53eb797a63ff0e8229b4acad") }
    ]
}
目前我正在做

User.findOne({}, {"books.id":1} ,function(err, result){
    var bookIds = [];
    result.books.forEach(function(book){
        bookIds.push(book.id);
    });

});

有没有更好的方法?

它可以很容易地使用、使用和维护

使用mongoose执行相同的操作:

请注意,
books
这里不是mongoose文档,而是一个普通的js对象


您还可以添加以选择用户集合的某些部分来运行此聚合查询

例如,您可以只选择一个特定用户:

User.aggregate().match({
  _id: uid
}).unwind('$books').group(
  _id: 'books',
  ids: { $addToSet: '$books.id' }
}).exec(function(err, res) {
  // use res[0].ids
})

但是,如果您对将不同用户的书籍聚合到单个数组不感兴趣,最好不要使用
$group
$unwind

User.aggregate().match({
  _id: uid
}).project({
  _id: 0,
  ids: '$books.id'
}).exec(function(err, users) {
  // use users[0].ids
})

你的例子显然是错误的。这不是确切的用例。我只是为了简单地解释这个问题而编造:)
User.aggregate().unwind('$books').group(
  _id: 'books',
  ids: { $addToSet: '$books.id' }
}).exec(function(err, res) {
  // use res[0].ids
})
User.aggregate().match({
  _id: uid
}).unwind('$books').group(
  _id: 'books',
  ids: { $addToSet: '$books.id' }
}).exec(function(err, res) {
  // use res[0].ids
})
User.aggregate().match({
  _id: uid
}).project({
  _id: 0,
  ids: '$books.id'
}).exec(function(err, users) {
  // use users[0].ids
})