sql >> データベース >  >> NoSQL >> MongoDB

Mongooseの埋め込みドキュメントで配列の最後のオブジェクトを取得するにはどうすればよいですか?

    なんらかの方法で変更しない限り、「最新の」ドキュメントは常に配列の最後にあります。配列にアイテムを追加すると、 $push 演算子またはクライアントコードの配列操作メソッドを使用して追加。

    $addToSetのような演算子のみ または、$pushの修飾子を明示的に使用します 操作によりこれが変更されます。

    そのため、配列の最後で通常実行したいのは、$slice 、配列の「終わり」からアイテムを取得するための負のインデックス:

    Model.findById("55d3a39565698bbc68079e31")
        .select({ "comments": { "$slice": -1 }})
        .exec(function(err,doc) {
    
        })
    

    前述のように実際に配列を変更し、最新の日付が配列の最後の要素ではない場合は、 $sort 更新の修飾子。 $positionを要求した場合、通常は「場違い」になります。 修飾子または$addToSetを使用しました 。 $position 意図的であり、並べ替えることもできませんが、$addToSetの後にいつでも配列を並べ替えることができます。 このような操作では、配列の他のコンテンツを変更せずに、すべての日付を順番に配置します。

    Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
       { "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
    )
    

    配列を変更して、同じ$slice 配列が日付順になっているため、操作はクエリに適用されます。

    ただし、ドキュメント内の配列を順不同、または他の順序のままにしておきたいが、最新の日付も取得したい場合は、 .aggregate() $sort $lastを取得します 配列エントリ:

    Model.aggregate(
        [
            { "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } },
            { "$unwind": "$comments" },
            { "$sort": { "comments.date": 1 } },
            { "$group": {
                "_id": "$_id",
                "author": { "$first": "$author" },
                "link": { "$first": "$link" },
                "title": { "$first": "$title" },
                "date": { "$first": "$date" },
                "comments": { "$last": "$comments" }
            }}
        ]
    )
    

    マングースで集約フレームワークを使用する場合、_id 他のクエリで発生する「自動キャスト」は発生しないため(これは仕様によるものです)、ObjectIdにキャストする必要があります。 データがその形式でまだ利用可能でなく、文字列として入力されている場合は、自分自身を評価してください。

    これらは、配列から最後の要素(オプションで明示的にソートされた)を取得する方法です。




    1. Meteor:配列要素の2つの異なる投影を公開します

    2. mongoengine.fields.ImproperlyConfigured:PILライブラリが見つかりませんでした

    3. spring-data-redis1.7.0.M1を使用するときにredis-clusterを設定する方法

    4. C#用の最も成熟したMongoDBドライバーは何ですか?