Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何编写查询以检索匹配的每个子文档数组_Json_Node.js_Mongodb_Mongoose - Fatal编程技术网

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

Json 如何编写查询以检索匹配的每个子文档数组,json,node.js,mongodb,mongoose,Json,Node.js,Mongodb,Mongoose,这里我需要我的老师清楚地解释我的问题。如何编写查询来检索使用mongoose和nodejs匹配条件的每个子文档数组 这是我现有的JSON: [ { _id: "568ccd6e646489f4106470ec", area_name: "Padi", warehouse_name: "Hapserve Online Water Service", name: "Ganesh", email: "ganesh@excrin.com", mobile_

这里我需要我的老师清楚地解释我的问题。如何编写查询来检索使用mongoose和nodejs匹配条件的每个子文档数组

这是我现有的JSON:

[
{
    _id: "568ccd6e646489f4106470ec",
    area_name: "Padi",
    warehouse_name: "Hapserve Online Water Service",
    name: "Ganesh",
    email: "ganesh@excrin.com",
    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: "kalai131192@gmail.com",
    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"
        }
    ]
  }
]
在这里,我需要检索每个交付日期为今天的文档

这就是我的路线

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);
        });
    });
当我使用这个时,我不能得到所有的数据。仅从集合中检索两个数据

例如,如果我搜索日期为2016年1月11日,我只得到一个子文档 每个父id,但在上述日期为2016年1月11日的json中。对于一个父id,该日期有2个子文档,而另一个父id,该日期有1个子文档

我无法将mongoose查询检索写入匹配完成的每个子文档。。
非常感谢您的帮助。

$projection操作符仅投影第一个匹配元素,请参阅


投影所有子文档{bookings:1},然后在应用程序中筛选子文档。

听起来您可能想尝试,在那里您可以使用运算符进行筛选

运算符检查
booking
数组中的每个元素,运算符根据真实条件仅返回所需字段,相反,返回的是假值,而不是数组元素运算符然后通过与另一组[false]值进行比较,从数组中删除所有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);
    });
});

如何在上面的答案中添加另一个条件@chridam@Nodemon请为此创建一个新问题。