sql >> データベース >  >> NoSQL >> MongoDB

$ elemMatchプロジェクションを持つ同じコレクションでクエリプロジェクションを使用することは可能ですか?

    はい、これを行うには2つの方法があります。したがって、 $ elemMatch わずかな変更を加えて、すでに持っているように投影側で:

    Model.findById(id,
       { "comments": { "$elemMatch": {"created.by": "Jane" } } },
       function(err,doc) {
    

    または、クエリ部分に追加して、位置 $を使用します 演算子:

    Model.findOne(
        { "_id": id, "comments.created.by": "Jane" },
        { "comments.$": 1 },
        function(err,doc) {
    

    どちらの方法も完全に有効です。

    それよりも少し複雑なものが必要な場合は、 .aggregate() メソッドであり、 $ project 代わりに演算子:

    Model.aggregate([
        // Still match the document
        { "$match": "_id": id, "comments.created.by": "Jane" },
    
        // Unwind the array
        { "$unwind": "$comments" },
    
        // Only match elements, there can be more than 1
        { "$match": "_id": id, "comments.created.by": "Jane" },
    
        // Project only what you want
        { "$project": {
            "comments": {
                "body": "$comments.body",
                "by": "$comments.created.by"
            }
        }},
    
        // Group back each document with the array if you want to
        { "$group": {
            "_id": "$_id",
            "comments": { "$push": "$comments" }
        }}
    ],
    function(err,result) {
    

    したがって、集約フレームワークは、単に結果を集約するだけではなく、はるかに多くの目的で使用できます。 $ project 演算子を使用すると、 .find()を使用したプロジェクションよりも柔軟性が高くなります。 。また、複数の配列結果をフィルタリングして返すこともできます。これは、 .find()の射影では実行できないことでもあります。 。




    1. ドキュメントがすでに存在するかどうかを確認しても、Mongooseはドキュメントを保存しています

    2. 2つのmongodbコレクションを比較する方法は?

    3. 条件付きの既存のフィールドからスコアを計算します

    4. Mongodb:$またはfind()で使用すると、一致したフィルターを返します