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
})