-1

次の構造のドキュメントを含むコレクション 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
}
4

1 に答える 1

1

ids宣言行を次のように置き換えます。

var ids = db.B.aggregate(
    {$unwind:"$ids"},
    {$group:{_id:0,x:{$addToSet:"$ids"}}}
).next();

実際$unwindにカーソルを返します...

于 2014-07-15T08:26:19.333 に答える