MongoDB聚合在数组具有特定值的位置按数组内的值对文档进行排序

时间:2019-03-11 13:45:14

标签: mongodb aggregation-framework

我们正在寻找一种通过文档内部数组中的值对文档进行排序的方法。特殊的是,我们只想按另一个属性具有特定值的值进行排序。

这是我们文档的样子:

{
  _id: '1',
  elements: [
    {
      key: 'locationName',
      value: 'A value'
    },
    {
      key: 'address',
      value: 'Somewhere over the rainbow'
    },
  ],
},
{
  _id: '2',
  elements: [
    {
      key: 'address',
      value: 'Far far away'
    },
    {
      key: 'locationName',
      value: 'Another value'
    },
  ],
},
{
  _id: '3',
  elements: [],
}

在这种情况下,我们要按elements.$.key === 'locationName'中的位置名称值对文档进行排序。

在使用$unwind$match之后,我们可以对文档进行排序-但是通过展开数组并按key === 'locationName'进行匹配,示例中的最后一个文档将被“删除”因为此文档的匹配失败。但是,当然,我们还希望列出没有给定locationName的文档。另一个问题是,当我们使用$unwind时,如果没有locationName作为键,则元素数组中的其他值将被删除-因此key: address将被删除,并且返回的文档将具有一个对象而不是看起来像这样的数组:

{
  _id: '1',
  elements: {
    key: 'locationName',
    value: 'A value'
  },
},
{
  _id: '2',
  elements: {
    key: 'locationName',
    value: 'Another value'
  },
}

因此,我们的想法是在包含locationName的聚合中创建一个新字段。我们知道有$addFields操作,但是在我们的例子中,我们的mongodb版本太低(我们使用的是3.2),因此我们想找到一个没有$addFields的解决方案。

我们不确定这是否是我们想做的事情,或者对于我们当前的mongoDB版本是否不可能。也许你们中的一个有一个解决办法的想法?

0 个答案:

没有答案