Mongodb 使用基于另一个 属性 的值的嵌套路径进行查询
Mongodb query using a nested path based on the value of another property
我有一个包含如下文档的集合:
{
_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
排序
这应该 return doc _id 1 和 doc _id 2,按日期排序,考虑 doc 1 的日期为 history.FINISHED.date,doc 2 的日期为 history.CREATED.date
稍加硬编码,因为您只有 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 },
},
]);
我有一个包含如下文档的集合:
{
_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
排序这应该 return doc _id 1 和 doc _id 2,按日期排序,考虑 doc 1 的日期为 history.FINISHED.date,doc 2 的日期为 history.CREATED.date
稍加硬编码,因为您只有 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 },
},
]);