通过比较文档中的片段进行查询

Query by comparing pieces within a document

我正在查询的文档有两个子部分,分别称为 OldResultsNewResults。我想要做的是找到 OldResults != NewResults 所在的所有文档。在 Mongo 中可以进行这样的查询吗?请注意 OldResultsNewResults 的架构对于不同的文档可能不同,但在同一文档中它们应该是相同的。

@chridam 这是我得到的例外:

Error("Printing Stack Trace")@:0
()@src/mongo/shell/utils.js:37
([object Array])@src/mongo/shell/collection.js:866
@(shell):10

uncaught exception: aggregate failed: {
    "errmsg" : "exception: invalid operator '$setEquals'",
    "code" : 15999,
    "ok" : 0
}

您可以尝试 aggregation framework, in particular the $setEquals 运算符,因为它比较两个或多个数组,如果它们具有相同的不同元素,则 returns 为真,否则为假:

db.collection.aggregate([
    {
        "$project": {
            "NewResults": 1,
            "OldResults": 1,
            "AreResultsSame": { "$setEquals": [ "$NewResults", "$OldResults" ] }
        }
    },
    {
        "$match": { "AreResultsSame": false }
    }
]);

让我们用几个测试文档来证明这一点:

db.collection.insert([
    { 
        _id: 1,
        OldResults: [
            { a: 1, b: 1 },
            { a: 1, b: 2 }
        ],
        NewResults: [
            { a: 1, b: 1 },
            { a: 1, b: 2 }
        ]
    },
    { 
        _id: 2,
        OldResults: [
            { a: 1, b: 1 },
            { a: 1, b: 2 }
        ],
        NewResults: [
            { a: 1, b: 2 },
            { a: 1, b: 2 }
        ]
    }
])

所以上面的聚合将输出带有 _id: 2 的文档,因为 2 个数组不相同:

输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : 2,
            "OldResults": [ 
                { "a": 1, "b": 1 }, 
                { "a": 1, "b": 2 }
            ],
            "NewResults": [ 
                { "a": 1, "b": 2 }, 
                { "a": 1, "b": 2 }
            ],
            "AreResultsSame": false
        }
    ],
    "ok" : 1
}