如何在doc中查询字段B之前的哪个字段A.

时间:2018-04-12 14:38:10

标签: mongodb

MongoDB是否支持这样的查询?

例如我有这样的数据

> db.foo.find()
{ "_id" : 1, "x" : 1, "y" : 2, "z" : 3 }
{ "_id" : 2, "y" : 2, "x" : 1, "z" : 3 }
{ "_id" : 3, "z" : 3, "y" : 2, "x" : 1 }

现在我想在字段y之前查询哪个字段x,即最后两个记录。

MongoDB是否支持它?

1 个答案:

答案 0 :(得分:1)

您可以使用以下聚合:

db.foo.aggregate([
    {
        $addFields: {
            keys: {
                $map: {
                    input: { $objectToArray: "$$ROOT" },
                    as: "item",
                    in: "$$item.k"
                }
            }
        }
    },
    {
        $match: {
            $expr: { $lt: [ { $indexOfArray: [ "$keys", "y" ] } , { $indexOfArray: [ "$keys", "x" ] } ] } 
        }
    },
    {
        $project: {
            keys: 0
        }
    }
])

$objectToArray可以将您的根文档转换为键值对数组。然后,您可以使用$indexOfArray获取xy键的位置,并使用$expr进行比较。

您需要注意的两件事(基于此page):

  • 包括重命名字段名称的更新可能会导致文档中字段的重新排序。
  • 从版本2.6开始,MongoDB会主动尝试保留文档中的字段顺序。在2.6版之前,MongoDB没有主动保留文档中字段的顺序。