Skip to main content

MongoDB - Generating dynamic $or using pipeline variable?

hoping someone can help as I am truly stuck!

I have this query

SwapModel.aggregate([
    {
        $match: {
            organisationId: mongoose.Types.ObjectId(organisationId),
            matchId: null,
            matchStatus: 0,
            offers: {
                $elemMatch: {
                    from: { $lte: new Date(from) },
                    to: { $gte: new Date(to) },
                    locations: { $elemMatch: { $eq: location } },
                    types: { $elemMatch: { $eq: type } },
                },
            },
//problem is HERE
            $or: {
                $map: {
                    input: "$offers",
                    as: "offer",
                    in: {
                        from: { $gte: new Date("$$offer.from") },
                        to: { $lte: new Date("$$offer.to") },
                        location: { $in: "$$offer.locations" },
                        type: { $in: "$$offer.types" },
                    },
                },
            },
        },
    },
    { ...swapUserLookup },
    { $unwind: "$matchedUser" },
    { $sort: { from: 1, to: 1 } },
]);

I'm trying to use the results of the $match document to generate an array for $or. My data looks like this:

[{
    _id: ObjectId("507f1f77bcf86cd799439011"),
    from: ISODate("2023-01-21T06:30:00.000Z"),
    to: ISODate("2023-01-21T18:30:00.000Z"),
    matchStatus: 0,
    matchId: null,
    userId: ObjectId("ddbb8f3c59cf13467cbd6a532"),
    organisationId: ObjectId("246afaf417be1cfdcf55792be"),
    location: "Chertsey",
    type: "DCA",
    offers: [{
        from: ISODate("2023-01-23T05:00:00.000Z"),
        to: ISODate("2023-01-24T07:00:00.000Z"),
        locations: ["Chertsey", "Walton"],
        types: ["DCA", "SRV"],
    }]
}, {
    _id: ObjectId("21575faf348660e8960c0d931"),
    from: ISODate("2023-01-23T06:30:00.000Z"),
    to: ISODate("2023-01-23T18:30:00.000Z"),
    matchStatus: 0,
    matchId: null,
    userId: ObjectId("d6f10351dd8cf3462e3867f56"),
    organisationId: ObjectId("246afaf417be1cfdcf55792be"),
    location: "Chertsey",
    type: "DCA",
    offers: [{
        from: ISODate("2023-01-21T05:00:00.000Z"),
        to: ISODate("2023-01-21T07:00:00.000Z"),
        locations: ["Chertsey", "Walton"],
        types: ["DCA", "SRV"],
    }]
}]

I want the $or to match all documents that have the corresponding from/to/location/type as the current document - the idea is two shifts that could be swapped

If the offers are known (passed as an array to the function calling aggregate), I can do this with:

$or: offers.map((x) => ({
            from: { $gte: new Date(x.from) },
            to: { $lte: new Date(x.to) },
            location: { $in: x.locations },
            type: { $in: x.types },
        }))

BUT I want to be able to do this in an aggregation pipeline when the offers will only be known from the current document, $offers

Is this possible? I've tried $in, $map, $lookup, $filter, $getField but can't get it right and can't get anything from Google as it thinks I want $in (which is the opposite of what I need).

I'm pretty new to MongoDB and am probably approaching this completely wrong but I'd really appreciate any help!

Via Active questions tagged javascript - Stack Overflow https://ift.tt/MqyfUEt

Comments

Popular posts from this blog

Prop `className` did not match in next js app

I have written a sample code ( Github Link here ). this is a simple next js app, but giving me error when I refresh the page. This seems to be the common problem and I tried the fix provided in the internet but does not seem to fix my issue. The error is Warning: Prop className did not match. Server: "MuiBox-root MuiBox-root-1" Client: "MuiBox-root MuiBox-root-2". Did changes for _document.js, modified _app.js as mentioned in official website and solutions in stackoverflow. but nothing seems to work. Could someone take a look and help me whats wrong with the code? Via Active questions tagged javascript - Stack Overflow https://ift.tt/2FdjaAW

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console