我在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
之类的操作。
答案 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]}
])