我是Mongo
新手,所以这可能是一个微不足道的问题。请耐心等待:))
我的Mongo
文档可以在逻辑上分组为有效和存档文档。如果revisions.validTo
日期字段的任何为null
或大于今天,则文档有效。否则,文档存档。
所以收集结构大致是:
[
{
_id: 'valid-1',
info: 'This is valid document because it has a revision with null validTo value',
revisions: [
{
validTo: ISODate("2014-01-01T00:00:00.000Z")
},
{
validTo: null
}
]
},
{
_id: 'valid-2',
info: 'This is valid document because it has a revision with validTo value > today',
revisions: [
{
validTo: ISODate("2014-01-01T00:00:00.000Z")
},
{
validTo: ISODate("2050-01-01T00:00:00.000Z")
}
]
},
{
_id: 'archive-1',
info: 'This document is in archive as all revisions have validTo < today',
revisions: [
{
validTo: ISODate("2014-01-01T00:00:00.000Z")
}
]
}
]
我可以使用
轻松查询有效文档db.getCollection('collection').find({
$or: [
{ 'revisions.validTo': { $gte: new Date() } },
{ 'revisions.validTo': null }
]
})
返回[valid-1, valid-2]
,但我无法找到如何查询存档文档以获取结果[archive-1]
。例如
db.getCollection('collection').find({
'revisions.validTo': { $lte: new Date() }
})
如果文档具有validTo
的任何修订版,则返回文档。今天。相反,我只想在其revisions.validTo
的全部时才获取文档。今天。
由于集合完全分为这两个组,我可能还可以通过查询有效组来获取存档组,然后在整个集合和有效文档集之间取得差异。这可能是用Mongo聚合框架完成的,但我还是找不到如何做到这一点。
因此,热烈欢迎任何有关构建档案文档查询的帮助!
(我也使用Mongoose,如果那可能有所帮助......?)
答案 0 :(得分:1)
您可以尝试使用$and
,$not
和$ne
运算符,如下所示
db.getCollection('collection').find({
$and: [
{ 'revisions.validTo': { $lte: new Date() } },
{ 'revisions.validTo': { $not: { $gte: new Date() } } },
{ 'revisions.validTo': { $ne: null } }
]
})
答案 1 :(得分:0)
您首先需要重新建模您的文档,以便日期为ISODates,以便您可以查询对它们的操作
[
{
info: 'This is valid document because it has a revision with null validTo value',
revisions: [
{
validTo: ISODate("2014-01-01T00:00:00.000Z")
},
{
validTo: null
}
]
},
{
info: 'This document is in archive as all revisions have validTo < today',
revisions: [
{
validTo: ISODate("2014-01-01T00:00:00.000Z")
}
]
}
]
然后您可以使用以下查询:
db.docs.find({ 'revisions.validTo': { $lte: new Date() }, 'revisions.validTo': { $ne: null } } ).pretty()
返回
{
"_id" : ObjectId("584a9a9212767a1fecf0e39f"),
"info" : "This document is in archive as all revisions have validTo < today",
"revisions" : [
{
"validTo" : ISODate("2014-01-01T00:00:00Z")
}
]
}