如何在猫鼬中找到最新的子文档

Posted

技术标签:

【中文标题】如何在猫鼬中找到最新的子文档【英文标题】:How to find most recent subdocument in mongoose 【发布时间】:2016-06-19 01:35:51 【问题描述】:

我有名为RegisterList 的猫鼬文档,该文档包含名为Booking 的子文档。

这里我需要检索子文档,也就是最近添加的子文档

下面是我的 json 数据

[
    
        _id: "56a3174bfc518cd014af7abd",
        area_name: "padi",
        name: "Vignesh",
        email: "vignesh4008@gmail.com",
        mobile_no: "9282438685",
        otp: "1625",
        __v: 0,
        date: "2016-01-23T06:01:47.450Z",
        booking: [
            
                name: "Vignesh",
                mobile: "9282438685",
                can_name: "Kinley",
                can_quantity: "2",
                can_cost: "80",
                can_path: "http://test15.watervan.in/wp-content/uploads/2015/07/p-95-WV-Kinley-25l.png",
                delivery_date: "23-01-2016",
                delivery_timeslot: "3pm-8pm",
                order_id: "S16064",
                subscription: "true",
                subscription_type: "EveryDay",
                total_cost: "560",
                address: "12,Ramanrajan street,,padi,Chennai",
                _id: "56a3174bfc518cd014af7abe",
                delivered_at: "2016-01-22T18:30:00.000Z",
                ordered_at: "2016-01-23T06:01:47.451Z",
                status: "Delivered"
            ,
            
                name: "Vignesh",
                mobile: "9282438685",
                can_name: "Kinley",
                can_quantity: "2",
                can_cost: "80",
                can_path: "http://test15.watervan.in/wp-content/uploads/2015/07/p-95-WV-Kinley-25l.png",
                delivery_date: "24-01-2016",
                delivery_timeslot: "3pm-8pm",
                address: "12,Ramanrajan street,,padi,Chennai",
                order_id: "S16064",
                subscription_type: "EveryDay",
                _id: "56a31ba2d55894ec15eac1cf",
                ordered_at: "2016-01-23T06:20:18.479Z",
                status: "UnderProcess"
            
        ]
    ,
    
        _id: "56a0bc8d3306f388131e56c6",
        area_name: "kodambakkam",
        name: "Ganesh",
        email: "ganesh@gmail.com",
        mobile_no: "9042391491",
        otp: "7828",
        __v: 0,
        date: "2016-01-21T11:10:05.074Z",
        booking: [
            
                name: "Ganesh",
                mobile: "9042391491",
                can_name: "Bisleri",
                can_quantity: "5",
                can_cost: "250",
                can_path: "http://test15.watervan.in/wp-content/uploads/2015/07/p-95-WV-Kinley-25l.png",
                delivery_date: "23-01-2016",
                delivery_timeslot: "3pm-8pm",
                order_id: "S12348",
                subscription: "true",
                subscription_type: "Alternate",
                total_cost: "1000",
                address: "15/A,Main Street,kodambakkam,Chennai",
                _id: "56a3164dc2c549e811c0d08f",
                delivered_at: "2016-01-22T18:30:00.000Z",
                ordered_at: "2016-01-23T05:57:33.169Z",
                status: "Delivered"
            ,
            
                name: "Ganesh",
                mobile: "9042391491",
                can_name: "Bisleri",
                can_quantity: "5",
                can_cost: "250",
                can_path: "http://test15.watervan.in/wp-content/uploads/2015/07/p-95-WV-Kinley-25l.png",
                delivery_date: "25-01-2016",
                delivery_timeslot: "3pm-8pm",
                address: "15/A,Main Street,kodambakkam,Chennai",
                order_id: "S12348",
                subscription_type: "Alternate",
                _id: "56a31c29d55894ec15eac1d0",
                ordered_at: "2016-01-23T06:22:33.307Z",
                status: "UnderProcess"
            
        ]
    
]

如何单独找到最近插入的子文档。在给定的 JsonCode 中。

我们将不胜感激...

更新:

我需要为delivery_datestatus 找到AND 条件的数据,那么我该如何编写猫鼬查询来获取数据

【问题讨论】:

不完全清楚你在问什么。您是指集合中每个文档的数组中最新的"ordered_at" 值吗?或者您可能是指集合中 "all" 文档中具有最新值的子文档?无论如何,在任何给定文档中,“最后一个”数组项将始终是最新的,除非您专门在位置添加新项或在更新时对数组进行排序。 完全正确您是指集合中每个文档的数组中最近的“ordered_at”值 如果您通过$push 运算符将子文档推送到booking 数组,它会将元素插入到数组的末尾。除非在$position 之内。 所以我们正在寻找的使操作变得简单的说明是,如果“最新”总是在数组的末尾(默认情况下它会在没有其他修改的情况下)那么所有你真正要求的是要从每个文档返回的数组的“最后一个”元素。当然,有一个内置的“投影”运算符可以做到这一点,而且我也确信之前已经在这里提出过直接问题。 你想要最近的ordered_at,可能是***.com/questions/16497016/…的重复? 【参考方案1】:

基于假设,您可以使用聚合框架获取最新的子文档。

Mongodb 3.2+版本

db.col.aggregate([
$project: 
    "area_name" : 1, 
    "name" : 1, 
    "email" : 1, 
    "mobile_no" :1, 
    "otp" : 1, 
    "__v" : 1, 
    "date" : 1, 
    "booking": $slice :["$booking",-1]
])

MongoDB 版本

db.col.aggregate([
    // Stage 1
    
      $unwind: "$booking"
    ,

    // Stage 2
    
      $sort: 
      "booking.ordered_at":-1
      
    ,

    // Stage 3
    
      $group: 
      _id: 
        id: "$_id",
        "area_name" : "$area_name", 
        "name" : "$name", 
        "email" : "$email", 
        "mobile_no" :"$mobile_no", 
        "otp" : "$opt", 
        "date" : "$date"   
        ,
        booking:$first: "$booking"
      
    ,

    // Stage 4
    
      $project: 
        _id: 0,
        _id: "$_id.id",
        "area_name" : "$_id.area_name", 
        "name" : "$_id.name", 
        "email" : "$_id.email", 
        "mobile_no" :"$_id.mobile_no", 
        "otp" : "$_id.opt", 
        "date" : "$_id.date",
        "booking": 1
      
    
  ]);

根据您提供的示例文档,输出如下所示

 
    "_id" : "56a3174bfc518cd014af7abd", 
    "booking" : 
        "name" : "Vignesh", 
        "mobile" : "9282438685", 
        "can_name" : "Kinley", 
        "can_quantity" : "2", 
        "can_cost" : "80", 
        "can_path" : "http://test15.watervan.in/wp-content/uploads/2015/07/p-95-WV-Kinley-25l.png", 
        "delivery_date" : "24-01-2016", 
        "delivery_timeslot" : "3pm-8pm", 
        "address" : "12,Ramanrajan street,,padi,Chennai", 
        "order_id" : "S16064", 
        "subscription_type" : "EveryDay", 
        "_id" : "56a31ba2d55894ec15eac1cf", 
        "ordered_at" : "2016-01-23T06:20:18.479Z", 
        "status" : "UnderProcess"
    , 
    "area_name" : "padi", 
    "name" : "Vignesh", 
    "email" : "vignesh4008@gmail.com", 
    "mobile_no" : "9282438685", 
    "date" : "2016-01-23T06:01:47.450Z"

 
    "_id" : "56a0bc8d3306f388131e56c6", 
    "booking" : 
        "name" : "Ganesh", 
        "mobile" : "9042391491", 
        "can_name" : "Bisleri", 
        "can_quantity" : "5", 
        "can_cost" : "250", 
        "can_path" : "http://test15.watervan.in/wp-content/uploads/2015/07/p-95-WV-Kinley-25l.png", 
        "delivery_date" : "25-01-2016", 
        "delivery_timeslot" : "3pm-8pm", 
        "address" : "15/A,Main Street,kodambakkam,Chennai", 
        "order_id" : "S12348", 
        "subscription_type" : "Alternate", 
        "_id" : "56a31c29d55894ec15eac1d0", 
        "ordered_at" : "2016-01-23T06:22:33.307Z", 
        "status" : "UnderProcess"
    , 
    "area_name" : "kodambakkam", 
    "name" : "Ganesh", 
    "email" : "ganesh@gmail.com", 
    "mobile_no" : "9042391491", 
    "date" : "2016-01-21T11:10:05.074Z"

【讨论】:

以上是关于如何在猫鼬中找到最新的子文档的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中更新它们时如何访问每个文档字段[重复]

如何使用猫鼬需要验证在猫鼬中插入多个文档?

如何在猫鼬中保存子文档的数组?

如何通过填充字段在猫鼬中查找文档?

如何通过填充字段在猫鼬中查找文档?

如何在猫鼬中找到随机记录[重复]