查询内部Array元素的datevalue

时间:2019-02-07 02:51:27

标签: mongodb

需要有关某些MongoDB查询的帮助:

下面是我的文档,我正在尝试根据2个条件进行搜索

  1. meta.tags.code = "ABC"
  2. 它的LastSyncDateTime应该

    • meta.extension.value == "" (或)
    • meta.extension.value小于meta.lastUpdated

数据:

{
    "meta" : {
        "extension" : [
            {
                "url" : "LastSyncDateTime",
                "value" : "20190206-00:49:25.694"
            },
            {
                "url" : "RetryCount",
                "value" : "0"
            }
        ],
        "lastUpdate" : "20190207-01:21:41.095",
        "tags" : [
            {
                "code" : "ABC",
                "system" : "type"
            },
            {
                "code" : "XYZ",
                "system" : "SourceSystem"
            }
        ]
    }
}

查询:

db.proc_patients_service.find({
    "meta.tags.code": "ABC",
    $or: [{
        "meta.extension.value": ""
    }, {
        $expr: { "$lt": [{ "mgfunc": "ISODate", "params": [{ "$arrayElemAt": ["$meta.extension.value", 0] }] }, { "mgfunc": "ISODate", "params": ["$meta.lastUpdate"] }] }
    }]
})

但这只是获取LastSyncDateTime为空且忽略其他条件的ABC患者。

1 个答案:

答案 0 :(得分:0)

使用MongoDB聚合,我已使用运算符$dateFromString将您的字符串转换为日期,然后根据您的条件比较该值。

db.proc_patients_service.aggregate([
    { $match: { "meta.tags.code": "ABC", } },
    { $unwind: "$meta.extension" },
    {
        $project: {
            'meta.tags': '$meta.tags',
            'meta.lastUpdate': { '$dateFromString': { 'dateString': '$meta.lastUpdate', format: "%Y%m%d-%H:%M:%S.%L" } },
            'meta.extension.url': '$meta.extension.url',
            'meta.extension.value': {
                $cond: {
                    if: { $ne: ["$meta.extension.value", "0"] }, then: { '$dateFromString': { 'dateString': '$meta.extension.value', format: "%Y%m%d-%H:%M:%S.%L" } }, else: 0
                }
            }
        }
    },
    {
        $match: {
            $or: [
                { "meta.extension.value": 0 },
                { $expr: { $lt: ["$meta.extension.value", "$meta.lastUpdate"] } }
            ]
        }
    },
    {
        $group: { _id: '_id', 'extension': { $push: '$meta.extension' }, "lastUpdate": { $first: '$meta.lastUpdate' }, 'tags': { $first: '$meta.tags' } }
    },
    {
        $project: { meta: { 'extension': '$extension', lastUpdate: '$lastUpdate', 'tags': '$tags' } }
    }
])