【发布时间】:2018-08-04 04:54:50
【问题描述】:
我有一个带有文档集合的 mongo db,其中每个元素都有一个繁忙的数组来收集事件。猫鼬模型如下:
busy: [{
_id : Schema.Types.ObjectId,
isBusy : Boolean,
eventType : String,
title : String,
startDate : Date,
endDate : Date,
event: {type: Schema.Types.ObjectId, ref: 'Event', index: true },
}],
当它被填充时,我想查询数组中没有在我尝试添加的事件同时发生的事件的所有文档,所以我只能选择不忙的文档那一刻。
我使用的查询是
{
"user.busy": {
$not: {
$elemMatch: {
'startDate': {
$gte: startDate,
$lt: endDate
},
'endDate': {
$gte: startDate,
$lt: endDate
},
isBusy: true
}
}
}
}
而且它不起作用。 关于我应该如何继续执行此操作的任何提示?
--- 样本数据
这是一个来自我的数据库的繁忙数组示例
"busy" : [
{
"isBusy" : true,
"eventType" : "Shooting",
"title" : "Shooting",
"startDate" : ISODate("2018-08-23T00:00:28.000Z"),
"endDate" : ISODate("2018-08-23T03:00:28.000Z"),
"event" : ObjectId("5b5573fcba399fababcb200d")
},
{
"isBusy" : true,
"eventType" : "Shooting",
"title" : "Shooting",
"startDate" : ISODate("2018-08-23T06:30:28.000Z"),
"endDate" : ISODate("2018-08-23T09:30:28.000Z"),
"event" : ObjectId("5b557410ba399fababcb2013")
},
{
"isBusy" : true,
"eventType" : "Shooting",
"title" : "Shooting",
"startDate" : ISODate("2018-08-23T10:11:06.000Z"),
"endDate" : ISODate("2018-08-23T13:11:06.000Z"),
"event" : ObjectId("5b5580216a5615aca0d089e0")
},
],
-- 编辑 1
由于查询在数据库上进行原始操作时有效,因此可能是我的 Mongoose 实现中的某些内容,按如下方式完成
Element.find({
"user.busy" :
{ $not :
{ $elemMatch :
{
'startDate' : { $gte: startDate, $lt: endDate },
'endDate' : { $gte: startDate, $lt: endDate },
isBusy : true
}
}
}
})
.exec()
.then(...)
【问题讨论】:
-
请发布您的示例文档和输出
-
你能解释一下什么场景不工作吗?为什么查询中有 isBusy 标志?
-
isBusy 标志是因为用户可以使用相同的字段在日历中创建其他类型的事件,这些事件不会使它们对系统来说是忙碌的
-
我试图删除 isBusy: true 但没有任何变化。唯一可行的情况是当我尝试创建一个重复的事件(相同的开始日期/结束日期)时。还有一点需要注意的是日期包括时间
-
为什么是
user.busy?尝试直接访问数组,即busy
标签: node.js mongodb express mongoose