Mongoose如何对查询

时间:2017-03-13 23:17:52

标签: arrays node.js mongodb sorting mongoose

我有以下架构:

const userSchema = new Schema({
  local: {
    email: {type: String, unique: true, sparse: true, lowercase: true, trim: true, required: true},
    password: {type: String, required: true},
  },
  username: {type: String, unique: true, lowercase: true, trim: true},
  Items: [{
    name: {type: String, trim: true},
    createdAt: {type: Date, default: Date.now}
  }]
});

我使用以下查询来检索所有项目:

User.findById(req.user.id, 'Items -_id', (err, user) => { ... });

返回以下内容:

{ Items: 
   [ 
     { name: 'test1',
       _id: 58c70800a03d09a31bb7fc17,
       createdAt: Mon Mar 13 2017 20:58:40 GMT+0000 (GMT) },
     { name: 'test2',
       _id: 58c70826a03d09a31bb7fc18,
       createdAt: Mon Mar 13 2017 20:59:18 GMT+0000 (GMT) } 
   ] 
}

我的问题是:如何编辑我的mongoose查询以返回基于Items属性按降序排序的createdAt数组内的对象?即test2出现在test1之上。

(一些额外的信息,项目数组平均每个用户的长度为3-10,并且我使用Nodejs作为后端,因此,在应用程序端对数组进行排序是可以忍受的,因为由于Nodejs的单线程特性,它的体积小或效率太低?),谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用aggregation来匹配_id,展开Items数组,执行降序排序并仅投影Items字段:

User.aggregate([{
    "$match": {
        "_id": new mongoose.mongo.ObjectId("58c7fa6987200dfc592d088c")
    }
}, {
    "$unwind": "$Items"
}, {
    "$sort": {
        "Items.createdAt": -1
    }
}, {
    "$group": {
        "Items": {
            "$push": "$Items"
        },
        "_id": 1
    }
}, {
    "$project": {
        "_id": 0,
        "Items": 1
    }
}], function(err, res) {
    console.log(res);
})