1

私はmongoが初めてで、これを噛む方法が本当にわかりません:

ownersコレクションに次のスキーマがあるとします。

{
    _id: ObjectId,
    name: "name",
    cars: [ObjectId, ObjectId, ObjectId, ...]
}

配列内の_ids は、cars他のコレクションに関連していますcars
現在、すべての所有者は多くの車を持つことができ、すべての車は複数の所有者を持つことができます (単なる多対多の関係)。

例えば

[
{'_id':'1', 'name':'Mr. A', cars: ['1','2',3',4',5'] },
{'_id':'2', 'name':'Mr. B', cars: ['6'] },
{'_id':'3', 'name':'Mr. C', cars: ['1','2'] },
{'_id':'4', 'name':'Mr. D', cars: ['2',3',5','6','7'] },
{'_id':'5', 'name':'Mr. E', cars: ['6'] }
]

問題は、Aさんがどのオーナーと車をシェアしているかをどうやって調べるかだ。
Aさんの場合、このような結果を得る方法:

[
{'owner_id': '3', 'cars': 2},
{'owner_id': '4', 'cars': 3}
]

集計フレームワークを使用しようとしましたが、その方法がわかりません。


編集
私はこの関数を書きましたが、それが正しい方法かどうかわかりません

function (owner)
{
    ret = {}
    owner.cars.forEach(function (car) {
        db.owners.find({cars: car}).forEach(function(own2){
            if(own2._id == owner._id){
                return;
            }
            if(ret[own2._id.str] !== undefined){
                ret[own2._id.str] += 1;
            }
            else{
                ret[own2._id.str] = 1;
            }
        });
    });
    return ret
}
4

2 に答える 2

0

私は2つのクエリでこれを行います。呼び出しコードに一時変数 (私は「車」と名付けました) を格納する必要があります。次のようになります。

var cars = db.owners.findOne({'name':'Mr. A'}, {cars:1})

var shared = db.owners.find({'name':{ '$ne': 'Mr. A'}, 'cars': {'$in':cars}}, {'name':1})
于 2013-04-24T10:55:26.313 に答える
0

Aさんと共有している所有者のみに関心がある場合は、次のことを試すことができます。

まず、A さんが所有する車を取得します。

var cars = db.owners.findOne({'name':'Mr. A'})

次に、Aさんを除く、Aさんと似た車の所有者を集計します。

db.owners.aggregate(
  {'$match':{$and : [{'cars':{'$in':cars}},{'name':{'$ne':'Mr. A'}}]}},
  {'$unwind':'$cars'},
  {'$group':{'_id':'$_id','owner_id':'$_id','cars':{$sum:1}}}
)

上記のクエリはテストしていませんが、試してみることをお勧めします。

于 2013-04-24T09:40:12.387 に答える