【问题标题】:Mongodb query using a nested path based on the value of another propertyMongodb查询使用基于另一个属性值的嵌套路径
【发布时间】:2021-04-25 16:26:51
【问题描述】:

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

{
   _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 }
      }
}

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

在前面的示例中,我将按状态的当前值排序(在相应的历史键中 => "history.VALUE_OF_STATE.date"

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

E.G:查询code == 1的所有文档并按history.VALUE_OF_EACH_DOCUMENT_STATE.date排序

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

【问题讨论】:

  • 假设您从第一个文档中获取状态,但在下一个文档中状态可能不同...,那么您需要对哪个值进行排序?
  • 我已更新问题以解决问题
  • 这将是一个非常奇怪的查询,为什么不创建一个名为 sortingDate 的字段并在写入时填写呢?
  • 这将是一个有效的解决方法,我想知道我的要求是否可以完成
  • 如果您从子文档移到子文档数组,可能会有这种情况。运行起来仍然很麻烦且昂贵(取决于您的收藏大小)

标签: mongodb mongodb-query spring-data-mongodb


【解决方案1】:

通过一些硬编码,因为您只有 4 种可能的状态:

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 },
  },
]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多