获取MongoDB文档,其中所有子文档都符合条件

时间:2016-12-09 11:41:48

标签: mongodb mongoose mongodb-query

我是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,如果那可能有所帮助......?)

2 个答案:

答案 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")
                }
        ]
}