なんらかの方法で変更しない限り、「最新の」ドキュメントは常に配列の最後にあります。配列にアイテムを追加すると、 $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
にキャストする必要があります。 データがその形式でまだ利用可能でなく、文字列として入力されている場合は、自分自身を評価してください。
これらは、配列から最後の要素(オプションで明示的にソートされた)を取得する方法です。