如何编写查询以获取字段不匹配的所有文档

时间:2020-01-21 16:22:12

标签: mongodb mongodb-query

我在编写查询时遇到了麻烦,我想在其中没有属性IsCurrentRevision为真的单个子文档的情况下获取所有文档。换句话说,仅获取没有单个修订版本标记为当前的文档。

到目前为止,我有:

{StartTimeUtc: {$gte: new ISODate('12/14/2019')}, 
EndTimeUtc: {$lte: new ISODate('01/21/2020')}, 
IsDeleted: false, 'MyDocument.IsCurrentRevision': false, 
"MyDocument.1.IsCurrentRevision" : {$exists: false}}

这使我处于某个位置,但是问题是我必须手动查询索引。在这种情况下,上面的查询返回的所有文档只有1个修订版(因此子文档数组中只有1个元素),而其修订版没有标记为最新。因此,如果我想获取具有2个修订版本的文档,第二个修订版本也标记为false,则需要将查询更新为:

{StartTimeUtc: {$gte: new ISODate('12/14/2019')}, 
EndTimeUtc: {$lte: new ISODate('01/21/2020')}, 
IsDeleted: false, 'MyDocument.1.IsCurrentRevision': false, 
"MyDocument.2.IsCurrentRevision" : {$exists: false}}

这显然很乏味,有没有更好的方法?如果有帮助,我正在使用Mongo Compass

编辑:

这是我的文档的样子

{
  _id: Guid,
  TemplateId: guid,
  StartTimeUtc: DateTime,
  EndTimeUtc: DateTime
  ..
  ..
  SoapNoteRevisions: Array {
      _id: Guid,
      IsCurrentRevision: boolean,
      ..
      ..
    }
}

由于文档本身在修订版(另一个子数组)中也包含相当多的字段,因此我摆脱了不需要的位

1 个答案:

答案 0 :(得分:3)

如果您需要MyDocument个元素/对象中没有IsCurrentRevision : true的文档,请尝试以下查询:

db.collection.find({'MyDocument.IsCurrentRevision': {$ne : true}})

如果使用聚合:

db.collection.aggregate([{$match : {'MyDocument.IsCurrentRevision': {$ne : true}}}])

收集数据:

/* 1 */
{
    "_id" : ObjectId("5e27282ad02e05b69498b814"),
    "MyDocument" : [ 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : false
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e272839d02e05b69498b947"),
    "MyDocument" : [ 
        {
            "IsCurrentRevision" : true
        }, 
        {
            "IsCurrentRevision" : true
        }, 
        {
            "IsCurrentRevision" : true
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("5e272846d02e05b69498ba5c"),
    "MyDocument" : [ 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : true
        }, 
        {
            "IsCurrentRevision" : false
        }
    ]
}

结果:

/* 1 */
{
    "_id" : ObjectId("5e27282ad02e05b69498b814"),
    "MyDocument" : [ 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : false
        }, 
        {
            "IsCurrentRevision" : false
        }
    ]
}