猫鼬查询以对主文档进行排序子文档按特定字段 [英] Mongoose Query To Sort Main Document & SubDocument by particular field

查看:57
本文介绍了猫鼬查询以对主文档进行排序子文档按特定字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有3个文档.

 const designTypeSchema = new mongoose.Schema ({
    name : {
        type : String,
        trim: true,
        required : true,
    },
    image : {
        type : String,
        trim: true,
        required : true,
    },
    status: { 
        type : Boolean,
        default: true
    } 
}
);

const tagTypeSchema = new mongoose.Schema ({
    name : {
        type : String,
        required : true,
    },
    design_type :
    {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'DesignType',
    }
    ,
    order : {  //need to apply sorting for this field
        type : Number,
        trim: true,
    },
    status: { 
        type : Boolean,
        default: true
    }  } );


const TagSchema = new mongoose.Schema ({
    name : {
        type : String,
        required : true,
    },
    tag_type : {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'TagType',
    image : {
        type : String,
        trim: true,
    },
    order : { //need to apply sorting for this field
        type : Number,
    },
    status: { 
        type : Boolean,
        default: true
    } 
}, 
);

我需要对TagType.order& 2个字段进行排序标记顺序.

I need to apply sort on 2 fields, TagType.order & Tag.order.

TagType将被视为主要文档,因此首先TagType应按顺序字段列出,然后Tag将成为子文档,并且应按Tag.order字段列出.

TagType will be considered as main document , so first TagType should list by order field and then Tag will be subdocument and it should list by Tag.order field.

我在下面的查询中尝试过:

I tried below query :

TagType.aggregate(
      [
        {
          $lookup: {
            from: "tags",
            localField: "_id",
            foreignField: "tag_type",
            as: "tags",
          },
      },
      {
          $lookup: {
              from: "designtypes",
              localField: "design_type",
              foreignField: "_id",
              as: "designtype",
          }
        },
        {
          $project:
          {
            _id: 1,
            name: 1,
            tag_type: 1,
            order: 1,
            "designtype.name":1,
            "tags._id":1,
            "tags.name":1,
            "tags.image":1,
            "tags.order":1,
            totalTags: {$size: "$tags"},
          }
        },
        {
          $sort : { 
            "order": -1,
            'tags.order' : -1
          } 
        },
      ]
    ).exec(function(err, results) {
      if (err) {
        throw err;
      }
      res.status(200).json({
          message: 'success',
          total: results.length,
          response: {
              data: results
          }
      })
    });

使用上面的查询,我得到的是排序结果,但是它仅对主文档而不对子文档(标签)应用排序.我在查询中缺少想要得到的结果.

Using above query i am getting sorted result But its applying sorting on main document only, not on subdocuments(Tags). What i am missing in query to get desire result.

我的问题与此> 6岁的问题有关:.但是那个问题并没有答案.所以我发布了一个新的.

My question is related to this 6 years old question :. But that question have not desire answer. So i posted new one.

任何帮助将不胜感激.谢谢

Any help will be appreciated. Thanks

推荐答案

当前无法直接在数组对象内部进行排序,

Currently sort is not possible directly inside array objects,

您可以选择两个选项,

  • 如果您要从查找中获取数据,请使用使用管道查找,它将允许在匹配文档中使用 $ sort 管道
  • $ unwind the array =>$ sort ==>再次将其分组到数组中,请参阅答案"
  • if you are getting data from lookup then use lookup with pipeline it will allow to use $sort pipeline within match documents
  • $unwind the array => $sort it => again $group it into array, Refer SO Answer

这里使用的是 $ lookup ,而不是简单的查找,而是可以使用"$ lookup withpipeline".

here you are using $lookup, instead of simple lookup you can use "$lookup with pipeline".

  {
    $lookup: {
      from: "tags",
      as: "tags",
      let: { id: "$_id" },
      pipeline: [
        {
          $match: {
            $expr: { $eq: ["$$id", "$tag_type"] }
          }
        },
        {
          $sort: { order: -1 }
        }
      ]
    }
  },

游乐场

第二种可能的解决方案:游乐场

Second possible solution: Playground

这篇关于猫鼬查询以对主文档进行排序子文档按特定字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆