11

2 つのコレクション間で情報を取得するのに問題があります。最初のコレクションには、従業員情報が格納されます。

{
        "_id" : ObjectId("4f9643967f8b9a3f0a00005a"),
        "birth_date" : "1963-09-09",
        "departments" : [
                {
                        "departments_id" : ObjectId("4f9643957f8b9a3f0a000007"),
                        "from_date" : "1990-01-03",
                        "to_date" : "1990-01-15"
                }
        ],
        "first_name" : "Parviz",
        "gender" : "M",
        "hire_date" : "1990-01-03",
        "last_name" : "Lortz",
}

2つ目は部門情報

{
        "_id" : ObjectId("4f9643957f8b9a3f0a000004"),
        "dept_name" : "Marketing",
        "managers" : [
                {
                        "employees_id" : ObjectId("4f96439b7f8b9a3f0a0186a9"),
                        "from_date" : "1985-01-01",
                        "to_date" : "1991-10-01"
                },
                {
                        "employees_id" : ObjectId("4f96439b7f8b9a3f0a0186aa"),
                        "from_date" : "1991-10-01",
                        "to_date" : "9999-01-01"
                }
        ]
}

私は見つけようとしています:特定の従業員のすべての部門

私は次のようなものを試しました:

employees = db.employees.find({_id:ObjectId("some_id")});
db.departments.find({_id:{$in:...}});

しかし、varの従業員からすべての部門の $in department_id を説明する方法がわかりません。

4

2 に答える 2

9

これは、単純なクエリでは実行できません。employees.departmentsをループし、反復ごとにそのdepartments_idを配列に追加する必要があります。この配列は、2行目で使用できます。これは、選択した言語で行うのが最適です。

これを簡単にするには、スキーマを変更する必要があります。1つのオプションは、部門情報を従業員レコードに保存することですが、あなたの場合、大量のデータを複製することになります。

代わりに、次のように、各部門に従業員IDと日付のリストを含めることをお勧めします。

{
        "_id" : ObjectId("4f9643957f8b9a3f0a000004"),
        "dept_name" : "Marketing",
        "managers" : [
        ]
        "employees" : [
            {
                    "employee_id" : ObjectId("4f9643967f8b9a3f0a00005a"),
                    "from_date" : "1990-01-03",
                    "to_date" : "1990-01-15"
            }
        ]
}

その場合は、次のコマンドを実行するだけです。

db.departments.find( { "employees.employee_id": ObjectId("some_id") } );
于 2012-04-24T14:06:44.137 に答える
5

Mongo 3.2 では、少なくとも 1 回の操作でそれを行う簡単な方法があります。

const employees = db.employees.find(); // query the employees collection
db.departments.find({
  managers: {
    $elemMatch: {
      employees_id: {
        $in: employees.map(e => e._id)
      }
    }
  }
});

$elemMatch修飾子 ( refを参照) は、オブジェクト プロパティの配列のような値に対してクエリを実行するのに役立ちます。

于 2016-03-15T00:03:53.003 に答える