乐闻世界logo
搜索文章和话题

Mongoose 如何查询数组的最后一个元素?

7 个月前提问
3 个月前修改
浏览次数52

6个答案

1
2
3
4
5
6

在 MongoDB 中,您可以使用 $slice 操作符来查询数组的最后一个元素。 $slice 可以与 .find().findOne() 方法一起使用来指定您想从数组中选择的元素的数量和位置。

如果您只想查询数组的最后一个元素,可以将 $slice 设置为 -1。以下是一个查询示例,它演示了如何选取数组字段 arrayField 中的最后一个元素:

javascript
db.collection.find({}, { arrayField: { $slice: -1 } })

在这个例子中:

  • db.collection 表示 MongoDB 中的集合。
  • {} 是查询条件(空,意味着选择所有文档)。
  • { arrayField: { $slice: -1 } } 是投影,它指定只返回 arrayField 的最后一个元素。

如果您有一个具体的查询条件,并且只想针对满足该条件的文档获取数组的最后一个元素,您可以像这样组合它:

javascript
db.collection.find({ someField: someValue }, { arrayField: { $slice: -1 } })

在这个例子中:

  • { someField: someValue } 是查询条件,用以选择具有特定 someField 字段值为 someValue 的文档。
  • { arrayField: { $slice: -1 } } 同样是投影,用来只选择 arrayField 中的最后一个元素。

请注意,$slice 不仅可以用来获取最后一个元素,还可以用来获取数组的子集,例如获取最后三个元素({ $slice: -3 })或跳过数组的前两个元素后取两个元素({ $slice: [2, 2] })。好的,继续补充 $slice 的应用,我们可以进一步讨论如何获取数组中的特定范围的元素。这在处理分页或者仅获取感兴趣的部分数据时非常有用。

比如,如果我们想要获取数组中从第二个元素开始的三个元素,我们可以设置 $slice 如下:

javascript
db.collection.find({}, { arrayField: { $slice: [1, 3] } })

在这里:

  • [1, 3] 表示从索引为 1 (数组的第二个元素)开始获取,然后向后数 3 个元素。

此外,MongoDB 也允许你结合使用 $elemMatch 查询操作符和 $slice 来选择匹配特定条件的数组元素的子集。例如,如果你想要找到含有特定元素的文档,并且仅返回这个元素,可以这样做:

javascript
db.collection.find({ arrayField: { $elemMatch: { key: value } } }, { 'arrayField.$': 1 })

在这个例子中:

  • { arrayField: { $elemMatch: { key: value } } } 是查询条件,它会匹配那些在数组 arrayField 中至少有一个元素含有键 key 并且值为 value 的文档。
  • {'arrayField.$': 1} 是投影,它指定只返回匹配 $elemMatch 条件的第一个元素。

结合 $slice$elemMatch 的高级用法可能会更复杂,但上述的用例展示了如何查询数组的特定部分,包括最后一个元素的常见做法。在实际的应用中,这些技术可以帮助您有效地查询和处理存储在 MongoDB 数组中的数据。

2024年6月29日 12:07 回复

在 3.2 中这是可能的。第一个项目让 myField 只包含最后一个元素,然后在 myField 上进行匹配。

shell
db.collection.aggregate([ { $project: { id: 1, myField: { $slice: [ "$myField", -1 ] } } }, { $match: { myField: "myValue" } } ]);
2024年6月29日 12:07 回复

您可以使用$expr(3.6 mongo 版本运算符)在常规查询中使用聚合函数。

比较query operatorsaggregation comparison operators_

对于标量数组

shell
db.col.find({$expr: {$gt: [{$arrayElemAt: ["$array", -1]}, value]}})

对于嵌入式数组 - 使用$arrayElemAt带有点表示法的表达式来投影最后一个元素。

shell
db.col.find({$expr: {$gt: [{"$arrayElemAt": ["$array.field", -1]}, value]}})

弹簧@Query代码

shell
@Query("{$expr:{$gt:[{$arrayElemAt:[\"$array\", -1]}, ?0]}}") ReturnType MethodName(ArgType arg);
2024年6月29日 12:07 回复

从 开始Mongo 4.4,聚合运算符$last可用于访问数组的最后一个元素:


例如,在find查询中:

shell
// { "myArray": ["A", "B", "C"] } // { "myArray": ["D"] } db.collection.find({ $expr: { $eq: [{ $last: "$myArray" }, "C"] } }) // { "myArray": ["A", "B", "C"] }

或者在aggregation查询中:

shell
db.collection.aggregate([ { $addFields: { last: { $last: "$myArray" } } }, { $match: { last: "C" } } ])
2024年6月29日 12:07 回复

使用**$slice**。

shell
db.collection.find( {}, { array_field: { $slice: -1 } } )

编辑:您可以使用它 { <field>: { $elemMatch: { <query1>, <query2>, ... } } }来查找匹配项。

但它不会准确地给出您正在寻找的内容。我认为这在 mongoDB 中还不可能。

2024年6月29日 12:07 回复

我在Mongo Google 官方群组上发帖,并得到了他们工作人员的答复。看来我正在寻找的东西是不可能的。我将使用不同的模式方法。

2024年6月29日 12:07 回复

你的答案