如何在 Mongoose 中找到与数组字段的最后一个元素与给定查询值匹配的所有文档?

Posted

技术标签:

【中文标题】如何在 Mongoose 中找到与数组字段的最后一个元素与给定查询值匹配的所有文档?【英文标题】:How can you find all documents that match the last element of an array field with a given query value in Mongoose? 【发布时间】:2020-05-02 16:01:48 【问题描述】:

我有一个类似于以下结构的集合:

type Products 
       productid: String
       owners: [String]

在我的查询中,我输入了一个值 user。我需要检索与owners 中最后一个元素匹配的所有文档,希望使用 find。我试过Products.find( "$owners.-1": user ) 到目前为止没有运气

有没有办法访问这个数组的最后一个元素?

【问题讨论】:

【参考方案1】:

如果您的意思是只获取传入 user 值的文档是来自 Products 集合的 owners 数组中的最后一个元素,那么试试这个:

var user = 'myname';    
Products.find(  $expr: $eq : [ $arrayElemAt: [ '$owners', -1 ] , user] )

收集数据:

/* 1 */

    "_id" : ObjectId("5e1f82b0d02e05b694b48b9d"),
    "productid" : "1",
    "owners" : [ 
        "others", 
        "myname"
    ]


/* 2 */

    "_id" : ObjectId("5e1f84d3d02e05b694b4cbe0"),
    "productid" : "2",
    "owners" : [ 
        "others", 
        "myname", 
        "anothername"
    ]


/* 3 */

    "_id" : ObjectId("5e1f84e2d02e05b694b4cee2"),
    "productid" : "3",
    "owners" : [ 
        "myname", 
        "anothername"
    ]


/* 4 */

    "_id" : ObjectId("5e1f84ebd02e05b694b4d0d0"),
    "productid" : "4",
    "owners" : [ 
        "myname"
    ]

结果:

 /** Only "productid" : "1" & "productid" : "4" are returned */
/* 1 */

    "_id" : ObjectId("5e1f82b0d02e05b694b48b9d"),
    "productid" : "1",
    "owners" : [ 
        "others", 
        "myname"
    ]


/* 2 */

    "_id" : ObjectId("5e1f84ebd02e05b694b4d0d0"),
    "productid" : "4",
    "owners" : [ 
        "myname"
    ]

【讨论】:

非常感谢!这正是我所需要的,而且效果很好!!【参考方案2】:

以下将为您提供所有者列表中的最后一个元素。

db.Products.find( ,  owners:  $slice: -1   );

【讨论】:

以上是关于如何在 Mongoose 中找到与数组字段的最后一个元素与给定查询值匹配的所有文档?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose MongoDB 找到数组字段中数组长度最小的那个

使用 Mongoose.js 按嵌套数组中的字段排序

如果未找到值,则使用 mongoose 将对象添加到数组中,否则更新字段

如何在 Mongoose 的嵌入式文档中检索数组的最后一个对象?

如何在 Mongoose 的嵌入式文档中检索数组的最后一个对象?

如何填充 Mongoose 数组中的字段?