MongoDB查询查找数组第一个元素的属性

时间:2013-10-04 06:40:04

标签: mongodb

我在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}),但显然会返回动作数组的所有元素。

NoSQL对我来说很新鲜。在此之前,我会将所有这些存储在关系数据库的两个表中,并完成SELECT id, (SELECT type FROM action WHERE document_id = d.id ORDER BY seq LIMIT 1) action_type FROM document d之类的操作。

3 个答案:

答案 0 :(得分:11)

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

db.collection.find({},{'actions':{$slice:1},'actions.type':1})

答案 1 :(得分:1)

您还可以使用2.2版中引入的Aggregation Pipeline

db.collection.aggregate([
  { $unwind: '$actions' },
  { $group: { _id: "$_id", first_action_type: { $first: "$actions.type" } } }
])

答案 2 :(得分:0)

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

db.collection.aggregate([
  { $project: {first_action_type: {$arrayElemAt: ["$actions.type", 0]}
])