[英]mongodb - match if a group of values from an array is in another given array [with Aggregation]
[英]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 ]
而且我想獲得所有選定的值而不是任何一個。 我想獲得615
、 630
的所有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
}
如果有615
和630
條記錄可用,我會同時獲得兩條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")
}
}
}
]
}
},
c1
和c2
是否相同,然后返回其中一個,否則在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"
}
}
])
為了解釋的目的,我分成幾部分,你可以很容易地合並,因為它們都是按順序排列的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.