当前位置: 首页 > 知识库问答 >
问题:

Mongoose按填充字段排序

谷梁宝
2023-03-14

好吧,我有以下几个Shemas:


    var BrandSchema = new Schema({
      name: {
        type: String,
        required: true,
        index: {
          unique: true
        },
        lowercase: true
      },
      logo: {
        type: ObjectId,
        ref: 'Image'
      }
    });

    var FollowActionSchema = new Schema({
      'actionDate': {
        type: Date,
        'default': Date.now
      },
      'brand': {
        type: ObjectId,
        ref: 'Brand'
      },
      'performer': {
        type: ObjectId,
        ref: 'User'
      },
      'type': String // followUser, folloBrand, followMerchant
    });

我想要的是让用户跟踪品牌,按品牌名排序,所以对于这样做,我对FollowAction进行查询,找到用户所做的所有FollowAction,然后填充brand字段。

所以问题是我不能为品牌名的查询排序,我知道的唯一方法是返回所有文档并从nodejs应用程序中对它们进行排序。有人知道我怎么能那样做吗??或者我是否应该改变shema结构??

我所做的查询是:


       async.waterfall([
        function findActions(next) {
          var options = {
            query: {
              performer: userId,
              $or: [{
                type: 'followBrand'
              }, {
                type: 'followMerchant'
              }]

            },
            projection: {
              actionDate: 1,
              brand: 1,
              merchant: 1,
              type: 1
            },
            sort: '-actionDate',
            pagination: pagination
          };
          utils.limitQuery('FollowAction', options, next);
        },
        function inflate(actions, next) {
          total = actions.count;
          var options = {
            projection: {
              name: 1,
              _id: 1,
              username: 1
            }
          };
          async.eachSeries(actions.result, function(action, done) {
            async.waterfall([
              function inflateAction(done) {
                action.inflate(options, done);
              },
              function addToArray(item, done) {
                trusted.push({
                  _id: item._id,
                  name: utils.capitalize(item.name || item.username),
                  type: item.name ? 'brand' : 'merchant'
                });
                return done(null, item);
              }
            ], done);
          }, next);
        }
      ], function(err) {
        callback(err, trusted, total);
      });

共有2个答案

祁博雅
2023-03-14

从这个简单的例子中得到这个想法

 Post.find({'_id': userId})
           .limit(10)
           .skip(0)
           .sort({'created_at':-1}) // this is used to sort
           .exec(function(error, result){
            if(!error){
              // console.log(result);
              res.send({data:result});
            } else{
              console.log(error);
            }
        });
周洋
2023-03-14

Mongoose API似乎确实支持对填充字段进行排序,但有一个bug完全破坏了它:https://github.com/automattic/Mongoose/issues/2202。你得到了一个结果,但它是完全错误的。

对于少量数据,可以使用Javascript array.prototype.sort()对结果数组进行排序。但请记住,这将直接修改排序数组。

在本例中,我所做的是为要排序的模型的模式添加一个排序键属性。对于您的示例,可以执行以下操作:

var FollowActionSchema = new Schema({
  // ...
  'brandSortKey': { type: String },
  'brand': {
    type: ObjectId,
    ref: 'Brand'
  },
  // ...
});

这并不完美,因为您必须自己使用正确的键显式设置此属性:

var FollowAction = Model('FollowAction', FollowActionSchema);

var aBrand = // some brand object

var f = new FollowAction({
   brand: aBrand._id,
   brandSortKey: aBrand.name
   // other properties
}); 

但是,您可以直接通过Mongoose API(或MongoDB)进行排序:

FollowAction.find({})
   .sort({ brandSortKey:1 })
   .exec(function (err, sortedResults) {
       // do something with sorted results.
   });
 类似资料:
  • 问题内容: 我使用Mongoose.js,无法解决3级层次结构文档的问题。 有2种方法可以做到。 首先 -没有裁判。 我需要出示C记录。仅知道_id的C,如何填充/找到它? 我曾尝试使用: 但是我不知道如何从returnet得到一个对象,我只需要c对象。 其次,如果使用裁判: 如何填充所有B,C记录以获取层次结构? 我试图使用这样的东西: 但是它将为single_c.title返回undefine

  • 问题内容: 我有要查询的模型(称为“活动”)(使用Mongoose)。他们的架构如下所示: 当我询问他们,我填充,,,和字段(所有引用)。在那之后,我也深入了这个领域。这是我的查询代码: 这已经是一个相对复杂的查询,但是我需要做更多。如果它碰到了声明的一部分,我 还 需要确保的字段等于字符串。我尝试使用,但是由于必须先填充事件,因此无法查询其任何字段。我还需要在其他多个查询中实现相同的目标。 如我

  • 问题内容: 我所做的: 我有一个模块 然后我有另一个课 我得到的是: 该作品不错,但字段为空。如果您编辑个人资料,则可以使用来向字段添加条目,但是我需要自动填写。 我的期望: 我希望打开个人资料时,每个设置为的记录都将在字段中可见。当我创建记录并将值设置为可以说时,该记录必须在字段中的配置文件中可见。如何实现呢? 问题答案: user_rel_ids =字段.many2many(comodel_n

  • 我正在使用pdfbox-1.8.12从PDF中读取内容以获取XFA。我已经能够成功地为大多数文件获取XFA,而没有遗漏任何字段值。 问题在于一些文件,如错误。pdf。我有许多字段没有像CIN这样的值,但当我在任何PDF查看器、foxit或Acrobat中打开文件时,它会显示该字段。 然后将字节[]转换为字符串。 这是此文件的xfa,如果您在此搜索“U72300DL1996PLC075672”,它将

  • 我有两个收藏,一个是用户,另一个是猫。我想要猫的数据下我的用户集合。但我没有得到。 user.js

  • Mongoose似乎不支持Mongo DBREF。显然,他们发布了“dbref”支持,但它实际上只是简单的引用(不具备引用不同集合中的文档的能力)。我终于创建了一个模式,允许我保存ObjectID引用的数组并填充它们,这对于我的模式的某些部分是很好的,但是如果我可以使用适当的DBREF创建一个数组,允许我引用来自多个集合的文档,那将是非常方便的。 幸运地(?)有一个模块可以在Mongoose中修补