首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用基于另一个属性的值的嵌套路径的Mongodb查询

问使用基于另一个属性的值的嵌套路径的Mongodb查询
EN

Stack Overflow用户
提问于 2021-01-21 17:11:50
回答 1查看 173关注 0票数 2

我有一个包含如下文档的集合:

代码语言:javascript
复制
{
   _id : 1,
   code: 1,
   state: "FINISHED",
   history:                                            //Object
      { 'CREATED': { date: xxx , anotherParam: xxx },
        'FINISHED': { date: xxx , anotherParam: xxx }
      }
},
{
   _id : 2,
   code: 1,
   state: "CREATED",
   history:                                            //Object
      { 'CREATED': { date: xxx , anotherParam: xxx }
},
{
   _id : 3,
   code: 2,
   state: "FINISHED",
   history:                                            //Object
      { 'CREATED': { date: xxx , anotherParam: xxx },
        'FINISHED': { date: xxx , anotherParam: xxx }
      }
}

我想做的是一个find查询,在这个查询中,我按照嵌套在历史中的日期对文档进行排序,该日期的关键字是每个文档的状态值。

在前面的示例中,我将按照state的当前值进行排序(在相应的历史关键字=> "history.VALUE_OF_STATE.date"中。

挑战是能够基于状态值在该路径内完成。

例:查询所有编码为== 1的单据,按history.VALUE_OF_EACH_DOCUMENT_STATE.date排序

这应返回文档日期1和文档_id 2,按日期排序,并将文档1的日期视为history.FINISHED.date,文档2的日期为history.CREATED.date

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-21 18:57:04

使用一些硬编码,因为你只有4种可能的状态:

代码语言:javascript
复制
db.states.aggregate([
  { $match: { code: 1 } },
  {
    $project: {
      _id: 1,
      code: 1,
      state: 1,
      history: 1,
      sortingField: {
        $switch: {
          branches: [
            {
              case: { $eq: ["$state", "CREATED"] },
              then: "$history.CREATED.date",
            },
            {
              case: { $eq: ["$state", "FINISHED"] },
              then: "$history.FINISHED.date",
            },
          ],
        },
      },
    },
  },
  {
    $sort: { sortingField: 1 },
  },
]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65824236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档