簡體   English   中英

如何從 mongodb 中的給定數組中檢索可用的“startTime”鍵的完全匹配值?

[英]How to retrieve exactly match values of available `startTime` key from given array in mongodb?

我有一個slots集合。 其回應如下:

{
    "_id" : ObjectId("5e32e55c9c058304f71eab70"),
    "date" : ISODate("2020-07-27T00:00:00.000Z"),
    "dayOfWeek" : 1,
    "startTime" : 600,
    "isBooked" : false,
    "isClosed" : false
},
{
    "_id" : ObjectId("5e32e55c9c058304f71eab71"),
    "date" : ISODate("2020-07-27T00:00:00.000Z"),
    "dayOfWeek" : 1,
    "startTime" : 615,
    "isBooked" : false,
    "isClosed" : false
},
{
    "_id" : ObjectId("5e32e55c9c058304f71eab72"),
    "date" : ISODate("2020-07-27T00:00:00.000Z"),
    "dayOfWeek" : 1,
    "startTime" : 630,
    "isBooked" : true,
    "isClosed" : true
},
{
    "_id" : ObjectId("5e32e55c9c058304f71eab73"),
    "date" : ISODate("2020-07-27T00:00:00.000Z"),
    "dayOfWeek" : 1,
    "startTime" : 645,
    "isBooked" : false,
    "isClosed" : false
}

我有一個startTime數組,例如:

[ 615, 630 ]

而且我想獲得所有選定的值而不是任何一個。 我想獲得615630的所有slots 如果沒有任何一個slot可用,那么我不需要這些結果。

這是我的查詢:(使用$all

db.slots.find({ isBooked: false, isClosed: false, date: { $gte: new Date("Mon, 27 Jul 2020 00:00:00 GMT"), $lte: new Date("Mon, 27 Jul 2020 00:00:00 GMT") }, startTime: { $all: [ 615, 630 ] } })

它什么也沒給。 我知道為什么? (僅用於測試)

使用$in

db.slots.find({ isBooked: false, isClosed: false, date: { $gte: new Date("Mon, 27 Jul 2020 00:00:00 GMT"), $lte: new Date("Mon, 27 Jul 2020 00:00:00 GMT") }, startTime: { $in: [ 615, 630 ] } })

它給出了一個記錄。

{
    "_id" : ObjectId("5e32e55c9c058304f71eab71"),
    "date" : ISODate("2020-07-27T00:00:00.000Z"),
    "dayOfWeek" : 1,
    "startTime" : 615,
    "isBooked" : false,
    "isClosed" : false
}

如果有615630條記錄可用,我會同時獲得兩條records ,否則我不需要這一條record 我想要完整的[ 615, 630 ]記錄。

我不知道只用find()是可能的,但是用aggregate()是可能的,聚合有很多方法,但我建議其中一種,

  • c1中為您的第一個條件獲取記錄[ 615, 630 ]
  • c2中獲取您的第一個和第二個其他條件的記錄
db.getCollection('datetime').aggregate([
    {
        $facet: {
            // will create a array of your first matching condition
            c1: [
                {
                    $match: {
                        startTime: { $in: [ 615, 630 ] } 
                    }
                }
            ],
            // will create a array of your second matching condition
            c2: [
                {
                    $match: {
                        startTime: { $in: [ 615, 630 ] },
                        isBooked: false, 
                        isClosed: false,
                        date: { 
                            $gte: new Date("Mon, 27 Jul 2020 00:00:00 GMT"), 
                            $lte: new Date("Mon, 27 Jul 2020 00:00:00 GMT") 
                        }
                    }
                }
            ]
        }
    },
  • 條件將檢查c1c2是否相同,然后返回其中一個,否則在result鍵中返回空白數組。
    {
        $project: {
            result: {
                $cond: [
                   // check condition if both are same then then return one of them otherwise empty 
                   { $setEquals: ["$c1", "$c2"]},
                   "$c1",
                   []
               ]
           }
        }
    },
  • 展開result ,因為我們需要將結果替換為 root
  • 將結果替換為根
    // unwind main result because it is array
    { $unwind: "$result" },
    // replace your unwind result in root it will make multiple object
    { 
        $replaceRoot: {
            newRoot: "$result"
        } 
    }
])

為了解釋的目的,我分成幾部分,你可以很容易地合並,因為它們都是按順序排列的。

工作場所: https://mongoplayground.net/p/dxZN9TMlR61

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM