如何编写查询以检索匹配的每个子文档数组

Nodemon

在这里,我需要清楚地说明我的问题。我如何编写查询以使用mongoose和nodejs检索符合条件的每个子文档数组。

这是我现有的JSON:

[
{
    _id: "568ccd6e646489f4106470ec",
    area_name: "Padi",
    warehouse_name: "Hapserve Online Water Service",
    name: "Ganesh",
    email: "[email protected]",
    mobile_no: "9042391491",
    otp: "4466",
    __v: 0,
    date: "06-01-2016",
    booking: 
    [
        {
            can_quantity: "4",
            delivery_date: "06-01-2016",
            delivery_timeslot: "10am-3pm",
            subscription: "true",
            subscription_type: "Weekly",
            total_cost: "240",
            order_id: "S13833",
            can_name: "Tata Waters",
            address: "15/A,Ramanrajan street,,Padi,Chennai",
            can_cost: "240",
            _id: "568ccd6e646489f4106470ee",
            ordered_at: "2016-01-06T08:16:46.825Z",
            status: "UnderProcess"
        },
        {
            can_name: "Bisleri",
            can_quantity: "4",
            can_cost: "200",
            delivery_date: "11-01-2016",
            delivery_timeslot: "3pm-8pm",
            order_id: "11537",
            address: "27,Main Street,Padi,Chennai",
            _id: "5693860edb988e241102d196",
            ordered_at: "2016-01-11T10:38:06.749Z",
            status: "UnderProcess"
        }
    ]
},
{
    _id: "56937fb8920629a0164604d8",
    area_name: "Poonamallee",
    warehouse_name: "Tata Waters",
    name: "M.Kalaiselvan",
    email: "[email protected]",
    mobile_no: "9003321521",
    otp: "2256",
    __v: 0,
    date: "2016-01-11T10:11:04.266Z",
    booking: 
    [
        {
            can_quantity: "4",
            delivery_date: "06-01-2016",
            delivery_timeslot: "10am-3pm",
            subscription: "true",
            subscription_type: "Alternate",
            total_cost: "640",
            order_id: "S13406",
            can_name: "Kinley",
            address: "133,Bajanai koil street, Melmanagar,Poonamallee,Chennai",
            can_cost: "160",
            _id: "56937fb8920629a0164604da",
            ordered_at: "11-01-2016",
            status: "UnderProcess"
        },
        {
            can_name: "Tata Waters",
            can_quantity: "2",
            can_cost: "120",
            delivery_date: "11-01-2016",
            delivery_timeslot: "10am-3pm",
            order_id: "11387",
            address: "140,Bajanai koil street, Melmanagar,Poonamallee,Chennai",
            _id: "56937ff7920629a0164604dc",
            ordered_at: "2016-01-11T10:12:07.719Z",
            status: "UnderProcess"
        },
        {
            can_name: "Bisleri",
            can_quantity: "4",
            can_cost: "200",
            delivery_date: "12-01-2016",
            delivery_timeslot: "10am-3pm",
            order_id: "16853",
            address: "140,Bajanai koil street, Melmanagar,Poonamallee,Chennai",
            _id: "56938584db988e241102d194",
            ordered_at: "2016-01-11T10:35:48.911Z",
            status: "UnderProcess"
        },
        {
            can_name: "Hapserve",
            can_quantity: "6",
            can_cost: "150",
            delivery_date: "11-01-2016",
            delivery_timeslot: "10am-3pm",
            order_id: "17397",
            address: "133,Bajanai koil street, Melmanagar,Poonamallee,Chennai",
            _id: "569385bbdb988e241102d195",
            ordered_at: "2016-01-11T10:36:43.918Z",
            status: "UnderProcess"
        },
        {
            can_name: "Bisleri",
            can_quantity: "5",
            can_cost: "250",
            delivery_date: "11-01-2016",
            delivery_timeslot: "10am-3pm",
            order_id: "14218",
            address: "133,Bajanai koil street, Melmanagar,Poonamallee,Chennai",
            _id: "56939a13c898ef7c0cc882b0",
            ordered_at: "2016-01-11T12:03:31.324Z",
            status: "Cancelled"
        }
    ]
  }
]

在这里,我需要检索交货日期为今天的每个文档

所以这是我的nodejs路线

router.get('/booking-date/:date', function(req, res){
        var id = req.params.date;
        RegisterList.find({'booking.delivery_date':id}, {'booking.$':1}, function(err, docs){
            if(err)
                throw err;
            res.json(docs);
        });
    });

在使用此功能时,无法获取所有数据。从集合中仅检索两个数据。

例如,如果我搜索日期11-01-2016,则每个父级ID仅获得一个子文档,但在日期11-01-2016的上述json中。一个父ID在该日期具有2个子文档,而另一个父ID在该日期具有1个子文档。

无法将猫鼬查询检索写到已完成匹配的每个子文档中。

克列丹

像你这样的声音可能想尝试的聚合框架,您可以$project使用带有过滤器的预订阵列成为可能$setDifference$map$cond运营商。

$map运营商考察中的每个元素booking阵列和$cond运营商只返回基于一个真实的condtion通缉领域,一个假值相反,而不是数组元素返回。$setDifference然后,运算符通过与另一个具有[false]值的集合进行比较,从数组中删除所有错误值,最终结果只是返回的匹配项:

router.get('/booking-date/:date', function(req, res){
    var id = req.params.date,
        pipeline = [
            {
                "$match": { 'booking.delivery_date': id }
            },
            { 
                "$project": {        
                    "booking": { 
                        "$setDifference": [
                            { 
                                "$map": {
                                    "input": "$booking",
                                    "as": "el",
                                    "in": {
                                        "$cond": [
                                            { "$eq": [ "$$el.delivery_date", id ] },
                                            "$$el",
                                            false
                                        ]
                                    }
                                }
                            },
                            [false]
                        ]
                    }
                }
            }
        ];

    RegisterList.aggregate(pipeline, function(err, docs){
        if(err) throw err;
        res.json(docs);
    });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

mongo:如何检索与数字或数组类型完全匹配的文档?

如何从匹配特定ID的文档中检索数组?

如何在documentdb中编写查询以匹配精确数组?

如何查询数组中的每个元素是否与集合字段匹配

如何展平这个子文档数组?

如何编写查询以检索我的用户表中每个用户的3条回复?

如何编写mongodb查询以仅查询文档数组中的特定字段?

MongoDB - 在聚合匹配后如何判断每个文档是否具有完全匹配的元素数组

如何编写查询以获取字段不匹配的所有文档

如何从mongodb查询文档对象内的对象以根据对象的键检索匹配的键值

当我订阅我的服务方法(执行查询)时,如何检索从 FireStore DB 中检索到的每个文档的 UID?

猫鼬-如何从集合中的每个文档中检索对象数组?

如何编写匹配查询或使用前缀查询

如何使用具有匹配属性的对象数组检索mongo文档

MongoDB 查询文档数组以获取特定匹配

查询匹配连续数组元素的文档

如何为嵌套文档编写聚合查询?

如何从AnimalDB查询中检索文档ID

过滤查询-检索每个过滤器过滤的文档数

如何在CosmosDB中为具有嵌套/多个数组的JSON文档编写SQL查询

如何查询作为数组的文档

如何在MongoDB中匹配多个子文档?

如何编写查询数组的 mongo 查询?

如何检索 firestore 文档中的数组?

如何编写一个SQL查询,以对每个现有唯一ID的组合检索一行?

检索与数组中的最大值匹配的子文档

如何编写用于集合匹配的选择查询

蒙哥 查询其子项必须与查询匹配的数组的文档

猫鼬查询文档匹配数组,无论其元素顺序如何