通过比较文档中的片段进行查询
Query by comparing pieces within a document
我正在查询的文档有两个子部分,分别称为 OldResults
和 NewResults
。我想要做的是找到 OldResults != NewResults
所在的所有文档。在 Mongo 中可以进行这样的查询吗?请注意 OldResults
和 NewResults
的架构对于不同的文档可能不同,但在同一文档中它们应该是相同的。
@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
}
我正在查询的文档有两个子部分,分别称为 OldResults
和 NewResults
。我想要做的是找到 OldResults != NewResults
所在的所有文档。在 Mongo 中可以进行这样的查询吗?请注意 OldResults
和 NewResults
的架构对于不同的文档可能不同,但在同一文档中它们应该是相同的。
@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
}