【问题标题】:How to write a query to get all documents where field doesn't matches如何编写查询以获取字段不匹配的所有文档
【发布时间】:2020-05-07 18:15:05
【问题描述】:

我在编写查询时遇到了一些麻烦,我想获取所有文档,但它们没有单个子文档,其属性 IsCurrentRevision 为 true。换句话说,只获取没有单个修订标记为当前的文档。

到目前为止我所拥有的是:

{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 个修订版的所有文档(因此子文档数组中只有一个元素),其修订版没有标记为当前。因此,如果我想获得具有 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,
      ..
      ..
    }
}

我去掉了不需要的位,因为文档本身在修订版中也有相当多的字段(另一个子数组)

【问题讨论】:

  • 可以分享收藏吗
  • 查看上面的编辑,如果您需要更多信息,请告诉我

标签: mongodb mongodb-query


【解决方案1】:

如果您需要 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
        }
    ]
}

【讨论】:

  • 完美,这正是我所需要的。非常感谢,我不敢相信我没想过使用 $ne 运算符。我想这就是我依靠 LINQ 得到的(大部分)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2021-11-18
  • 2021-08-03
  • 2019-09-18
  • 2022-08-24
相关资源
最近更新 更多