我的主要模式是一个事件,其中一些步骤嵌入到数组中。我想查询事件,并过滤步骤,并满足一定条件。因此,返回的事件并不具有其所具有的所有步骤,而仅是符合条件的那些步骤。 我可以使用聚合来完成此操作,但是我需要以猫鼬文档形式返回的文档,因此我可以在每个文档上使用save()函数,因此只能使用我认为的猫鼬来完成。
事件示例:
{
"_id" : ObjectId("5d57b6ad754e9d1ec0c123e6"),
"title" : "wedding",
"user" : ObjectId("5d4fedfd63dc55207cf128ff"),
"date" : ISODate("2019-09-24T20:00:00.000Z"),
"steps" : [
{
"_id" : ObjectId("5d57b6ad754e9d1ec0c123e7"),
"title" : "home",
"startDate" : ISODate("2019-06-27T20:00:00.000Z"),
"endDate" : ISODate("2019-07-21T20:00:00.000Z"),
"isDone" : false,
"state" : 2
},
{
"_id" : ObjectId("5d57b6ad754e9d1ec0c123e8"),
"title" : "guests",
"startDate" : ISODate("2019-07-07T20:00:00.000Z"),
"endDate" : ISODate("2019-07-30T20:00:00.000Z"),
"isDone" : false,
"state" : 2
},
{
"_id" : ObjectId("5d57b6ad754e9d1ec0c123e9"),
"title" : "car",
"startDate" : ISODate("2019-07-11T20:00:00.000Z"),
"endDate" : ISODate("2019-07-20T20:00:00.000Z"),
"isDone" : false,
"state" : 2
}
]
};
到目前为止的汇总:
const now = new Date();
Event.aggregate([
{
$match: { date: { $gte: now } },
},
{
$unwind: '$steps',
},
{
$match: { 'steps.startDate': { $lte: now }, 'steps.endDate': { $gte: now }, 'steps.state': { $ne: 1 } },
},
])
我已经搜索过文档,但没有找到任何内容。
答案 0 :(得分:0)
对于基于批注的更新子文档,无论是在主文档还是在子文档中:
var now = new Date()
Events.find({
date: { $gte: now }, 'steps.startDate': { $lte: now }, 'steps.endDate': { $gte: now }, 'steps.state': { $ne: 1 }
},
(err, events) => {
events.forEach(event => {
var steps = event.steps.filter(step => (step.startDate < now && step.endDate > now && step.state != 1));
steps.forEach(step => {step.state = 1;})
event.save((err, event_)=>{console.log('event updated: ', event_)})
})
}
)
我在其中测试过的完整示例项目(它不存在): https://codepen.io/ya3ya6/pen/xxKLNNG?editors=0010
(帮助:您应该两次运行此代码,第一次将init
设置为true,以创建一些示例数据。第二次,将init
设置为false以运行实际的查询。您可以在mongodb中检查数据库数据以验证结果。)