38

私はちょうどこの問題で立ち往生しています。2 つの Mongoose スキーマがあります。

var childrenSchema = mongoose.Schema({
    name: {
        type: String
    },
    age: {
        type: Number,
        min: 0
    }
});

var parentSchema = mongoose.Schema({
    name : {
        type: String
    },
    children: [childrenSchema]
});

childrenSchema問題は、すべての親ドキュメントからすべてのサブドキュメント (この場合はオブジェクト)を取得する方法です。いくつかのデータがあるとしましょう:

var parents = [
    { name: "John Smith",
    children: [
        { name: "Peter", age: 2 }, { name: "Margaret", age: 20 }
    ]},
    { name: "Another Smith",
    children: [
        { name: "Martha", age: 10 }, { name: "John", age: 22 }
    ]}
];

18 歳以上のすべての子供を 1 回のクエリで取得したいのですが、可能ですか? すべての回答をいただければ幸いです。

4

3 に答える 3

24

Mongoose では、次の.populate()ようにエレガントな関数を使用することもできます。

parents
.find({})
.populate({
  path: 'children',
  match: { age: { $gte: 18 }},
  select: 'name age -_id'
})
.exec()
于 2015-02-08T14:45:29.013 に答える
1

A. Jesse Jiryu Davis の応答は魅力的ですが、Mongoose の新しいバージョン (Mongoose 5.x) では次のエラーが発生します。

Mongoose 5.x では、さまざまな演算子を に渡すことができませんModel.aggregate()。の代わりにModel.aggregate({ $match }, { $skip })Model.aggregate([{ $match }, { $skip }])

したがって、コードは次のようになります。

> db.parents.aggregate([{
    $match: {'children.age': {$gte: 18}}
}, {
    $unwind: '$children'
}, {
    $match: {'children.age': {$gte: 18}}
}, {
    $project: {
        name: '$children.name',
        age:'$children.age'
    }
}])
{
    "result" : [
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb5"),
            "name" : "Margaret",
            "age" : 20
        },
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb6"),
            "name" : "John",
            "age" : 22
        }
    ],
    "ok" : 1
}

(クエリを囲む配列ブラケットに注意してください)

これが誰かを助けることを願っています!

于 2019-05-29T10:53:42.013 に答える