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})たが、明らかにアクション配列のすべての要素を返します。

NoSQL は私にとってまったく新しいものです。以前は、これらすべてをリレーショナル データベースの 2 つのテーブルに格納し、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 に答える
0

$arrayElemAt構文は直感的でないかもしれませんが、実際には演算子を使用するのが最も洗練された方法です。

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