次の構造のドキュメントを含むコレクション A を想定します。
{_id: N}
N は正の整数です。
そして、次の種類のドキュメントを含む 2 番目のコレクション B:
{_id: M, ids: [n1,n2,...]}
n1、n2、... は正の整数です。
B のドキュメントは、コレクション A の一連のドキュメントを効果的に定義しています。
つまり、コレクション A には 2 種類のドキュメントがあります。
- コレクション B のドキュメントの少なくとも 1 つの ids-array に _id 値が含まれているドキュメント
- コレクション B のドキュメントのどの ids-array にも _id が含まれていないもの
MongoDB シェル式を使用して次のタスクを実行する方法がわかりません。
コレクション B のドキュメントの ids-array に含まれていないすべてのドキュメントをコレクション A から削除したいと思います。
私の直感的なアプローチは、すべての ids-arrays を集計付きのセットに変換し、この新しい配列を使用して remove-method 内でクエリを作成することですが、これはうまくいかないようです。
私は複数のことを試しました-これが1つです:
> db.A.find()
{ "_id" : 1 }
{ "_id" : 2 }
{ "_id" : 3 }
{ "_id" : 4 }
{ "_id" : 5 }
{ "_id" : 6 }
{ "_id" : 7 }
{ "_id" : 8 }
> db.B.find()
{ "_id" : ObjectId("53c4c9ae55cdc092a772cb15"), "ids" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("53c4c9b855cdc092a772cb16"), "ids" : [ 3, 4, 5 ] }
> var ids = db.B.aggregate({$unwind:"$ids"},{$group:{_id:0,x:{$addToSet:"$ids"}}})
{ "_id" : 0, "x" : [ 5, 4, 3, 2, 1 ] }
> ids
{ "_id" : 0, "x" : [ 5, 4, 3, 2, 1 ] }
> db.A.find({_id:{$nin:ids.x}})
error: {
"$err" : "Can't canonicalize query: BadValue $nin needs an array",
"code" : 17287
}