Mongo Aggregation Frameworkを使用して、ドキュメント内の配列と別のユーザー定義の配列との間の交差を検出しようとしています。 正しい結果が得られず、配列の内部に配列があるため、私の推測はその通りです。サブ文書配列とユーザー定義配列の交点?
これは私のデータセットです。
マイドキュメント:
{
"_id" : 1,
"pendingEntries" : [
{
"entryID" : ObjectId("5701b4c3c6b126083332e65f"),
"tags" : [
{
"tagKey" : "owner",
"tagValue" : "john"
},
{
"tagKey" : "ErrorCode",
"tagValue" : "7001"
},
{
"tagKey" : "ErrorDescription",
"tagValue" : "error123"
}
],
"entryTime" : ISODate("2016-04-04T00:26:43.167Z")
}
]
},
/* 1 */
{
"_id" : 2,
"pendingEntries" : [
{
"entryID" : ObjectId("5701b4c3c6b126083332e65d"),
"tags" : [
{
"tagKey" : "owner",
"tagValue" : "peter"
},
{
"tagKey" : "ErrorCode",
"tagValue" : "6001"
},
{
"tagKey" : "JIRA",
"tagValue" : "Oabc-123"
}
],
"entryTime" : ISODate("2016-04-04T00:26:43.167Z")
}
]
},
/* 2 */
{
"_id" : 3,
"pendingEntries" : [
{
"entryID" : ObjectId("5701b4c3c6b126083332e65c"),
"tags" : [
{
"tagKey" : "owner",
"tagValue" : "abc"
},
{
"tagKey" : "ErrorCode",
"tagValue" : "6001"
},
{
"tagKey" : "JIRA",
"tagValue" : "abc-123"
}
],
"entryTime" : ISODate("2016-04-04T00:26:43.167Z")
}
]
}
マイクエリ:
db.entrylike.aggregate(
[
{ $project: { "pendingEntries.entryID": 1, "common": { $setIntersection: [ "$pendingEntries.tags", [{ "tagKey" : "ErrorCode", "tagValue" : "7001" }] ] } } }
]
)
結果:
{
"result" : [
{
"_id" : 1,
"pendingEntries" : [
{
"entryID" : ObjectId("5701b4c3c6b126083332e65f")
}
],
"common" : []
},
{
"_id" : 2,
"pendingEntries" : [
{
"entryID" : ObjectId("5701b4c3c6b126083332e65d")
}
],
"common" : []
},
{
"_id" : 3,
"pendingEntries" : [
{
"entryID" : ObjectId("5701b4c3c6b126083332e65c")
}
],
"common" : []
}
],
"ok" : 1
}
私が空であることを第1の共通フィールドを期待しておりません。誰かが私に間違っていることを教えてもらえますか?または私が取ることができる任意の回避策。
私はmongodb 3.0.8を使用しています。私は、Mongodb 3.2が私のニーズを満たすいくつかの機能を提供できることを認識していますが、3.2アップグレードはすぐにパイプラインにはないので、可能ならMongo3.0を使用してこれを解決しようとしています。
私の目標は、tags配列をユーザー定義リストの共通要素で置き換えるか、共通要素で新しいフィールドを追加することです。私は私の事例の後にするつもりです。
を、単に '$ setIntersection'内に直接単一要素の配列を記譜することは完全に罰金ですので、' $のliteral'はこのコンテキストでは必要ないはずです。返し
。また、$ setIntersectionは、要素が「正確な」順序であり、 '[{" tagValue ":" 7001 "、" tagKey ":" ErrorCode "}]'表記はそうでないため、一致していなければなりません。ここでは、比較データまたは格納されたデータのどちらかがキーの順番ではありませんでした。もちろん、 '$ map'を使って要素にアクセスし、変更されたフォームを返す場合は、主なポイントです。それは述べたとおりです。 –
@ NeeLunnまた、 '$ literal'は必要ではなく' $ literal'がなくても、* "FieldPath 'ErrorCode'が$で始まらない* – styvane
あなたはタイプミスがあったはずです。 '' $ setIntersection ":[[" a "、" b "]、[" b "]]}}})'は単純な再現性があります場合。 –