9

我在 MongoDB 中有以下数据(简化了我的问题所必需的内容)。

{
    _id: 0,
    actions: [
        {
            type: "insert",
            data: "abc, quite possibly very very large"
        }
    ]
}
{
    _id: 1,
    actions: [
        {
            type: "update",
            data: "def"
        },{
            type: "delete",
            data: "ghi"
        }
    ]
}

我想要的是为每个文档找到第一个动作类型,例如

{_id:0, first_action_type:"insert"}
{_id:1, first_action_type:"update"}

(如果数据结构不同,那很好,但我需要以某种方式存在这些值。)

编辑:我试过db.collection.find({}, {'actions.action_type':1})了,但很明显,它返回了 actions 数组的所有元素。

NoSQL 对我来说很新。以前,我会将所有这些存储在关系数据库中的两个表中,然后执行类似SELECT id, (SELECT type FROM action WHERE document_id = d.id ORDER BY seq LIMIT 1) action_type FROM document d.

4

3 回答 3

12

您可以在投影中使用$slice运算符。(但对于你所做的,我不确定当你更新它时数组的顺序是否保持不变。请记住))

db.collection.find({},{'actions':{$slice:1},'actions.type':1})
于 2013-10-04T13:05:57.683 回答
1

您还可以使用2.2 版本中引入的聚合管道:

db.collection.aggregate([
  { $unwind: '$actions' },
  { $group: { _id: "$_id", first_action_type: { $first: "$actions.type" } } }
])
于 2013-10-04T08:56:14.933 回答
0

使用$arrayElemAt运算符实际上是最优雅的方式,尽管语法可能不直观:

db.collection.aggregate([
  { $project: {first_action_type: {$arrayElemAt: ["$actions.type", 0]}
])
于 2020-06-12T12:56:05.183 回答