Как найти идентификаторы по массиву, который создан оператор фасета - PullRequest
2 голосов
/ 21 мая 2019

У меня есть коллекция клиентов на MongoDB. С полем статуса. Которые могут иметь одинаковые поля идентификатора. И мне нужно сначала найти измененное значение, например «Гость», и передать его идентификаторы в конкретный конвейер с именем «гости». И клиентам со статусом «Участник» мне нужно подтолкнуть другой конвейер с именем «участники», у которого Id будет равным идентификатору из «гостей» конвейера агрегации. Это делается для того, чтобы получить количественные элементы в «гостям» и «участниках».

Элемент его члена:

{"_id"=>{"$oid"=>"5ce2ecb3ad71852e7fa9e73f"},
       "status"=>"member",
       "duration"=>nil,
       "is_deleted"=>false,
       "customer_id"=>"17601",
       "customer_journal_item_id"=>"62769",
       "customer_ids"=>"17601",
       "customer_journal_item_ids"=>"62769",
       "self_customer_status_id"=>"21078",
       "self_customer_status_created_at"=>"2017-02-01T00:00:00.000Z",
       "self_customer_status_updated_at"=>"2017-02-01T00:00:00.000Z",
       "updated_at"=>"2019-05-20T18:06:43.655Z",
       "created_at"=>"2019-05-20T18:06:43.655Z"}}

Моя агрегация

    {
        '$sort': {'self_customer_status_created_at': 1}
    }, 
    {'$match': 
        {
            'self_customer_status_created_at': 
            {
                "$gte": Time.parse('2017-01-17').beginning_of_month, 
                "$lte": Time.parse('2017-01-17').end_of_month 
            }
        } 
    }, 
    {
        "$facet": {
            "guests": 
            [ 
                { 
                    "$group": {
                        "_id": "$_id", 
                        "data": {
                            '$first': '$$ROOT'
                        } 
                    } 
                }, 
                {
                    "$match": {
                        "data.status": "guest"
                    }
                }, {
                    "$group": {
                        "_id":nil, 
                        "array":{
                            "$push": "$data.self_customer_status_id" 
                        } 
                    } 
                }, 
                { 
                    "$project":{
                        "array": 1,
                        "_id":0
                    } 
                }
            ], "members": 
            [ 
                { 
                    "$group": {
                        "_id": "$_id", "data": {
                            '$last': '$$ROOT'
                        } 
                    } 
                }, 
                {
                    "$match": {
                        "data.status": "member",
                        "data.self_customer_status_id": {
                            "$in": [
                                    "$guests.array"
                                  ]
                            }  
                        } 
                    }
                } 
            ] 
        } 
    }, {
        "$project": 
        { 
            "members": 1, 
            "guests.array": 1 
        } 
        } 
    ]
).as_json

Вместо массива "guest.array"? У меня ошибка: Mongo::Error::OperationFailure: $in needs an array (2)

Что я делаю не так? Извините, мой английский!

1 Ответ

0 голосов
/ 21 мая 2019

второе выражение в лице не видел первое выражение нужно удалить

,
                        "data.self_customer_status_id": {
                            "$in": {
                                "$arrayElemAt": 
                                [
                                    "$guests.array", 
                                    0
                                ]
                            }  
                        } 
    {"$match": {"data.self_customer_status_id": { "$in": ["guests.array"] } } }
    ```
this link paste before $project
...