MongoDB возвращает только указанный запрос - PullRequest
1 голос
/ 27 мая 2020
db.customerOrder.insert({
  firstName: "Andrew",
  lastName: "Lee",
  DOB: ISODate("1974-10-28T00:00:00Z"),
  phone: "+1 (959) 567-3312",
  email: "mark@gmail.com",
  address: {
    street: "Cornish Street, Victoria",
    houseNumber: "68",
    postalCode: "3024",
    country: "Australia",
  },
  language: ["English", "Mandarin"],
  balance: 0,
  orders: [
    {
      orderNumber: "ord003",
      orderDate: ISODate("2020-01-10T00:00:00Z"),
      staffNumber: "stf789"
    }
  ]
});

Учитывая документ выше и другие документы, которые содержат другие заказы и номер заказа, как мне указать агрегацию, чтобы в ней были перечислены только все номера заказов, которые обрабатываются StaffNumber x?

Пример , orderNumber ord004 и ord005 обрабатывается StaffNumber stf890

Я пытался сделать

db.customerOrder.aggregate([ {"$match":{"orders.staffNumber":"stf890"}}, {"$project":{"orders.orderNumber":1, "_id":0}} ])

, но результат был

{
        "orders" : [
                {
                        "orderNumber" : "ord003"
                },
                {
                        "orderNumber" : "ord003"
                },
                {
                        "orderNumber" : "ord005"
                }
        ]
}
{
        "orders" : [
                {
                        "orderNumber" : "ord001"
                },
                {
                        "orderNumber" : "ord005"
                }
        ]
}
{
        "orders" : [
                {
                        "orderNumber" : "ord003"
                },
                {
                        "orderNumber" : "ord004"
                }
        ]
}

Я ожидаю, что результат будет выводить только ord004 и ord005

Как мне этого добиться? Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Если вам не важна структура, вы можете просто $unwind и затем сопоставить. в противном случае вам нужно использовать что-то вроде $ filter

Вариант 1:

db.customerOrder.aggregate([
    {
        "$match": {
            "orders.staffNumber": "stf890"
        }
    },
    {
        "$unwind": "$orders"
    },
    {
        "$match": {
            "orders.staffNumber": "stf890"
        }
    },
    {
        "$project": {"orders.orderNumber": 1, "_id": 0}
    }])

Вариант 2:

db.customerOrder.aggregate([
    {
        "$match": {
            "orders.staffNumber": "stf890"
        }
    },
    {
        $project: {
            orders: {
                $filter: {
                    input: "$orders",
                    as: "order",
                    cond: {
                        $eq: ["$$order.staffNumber", "stf890"]
                    }
                }
            }
        }
    },
    {
        "$project": {
            "orders.orderNumber": 1,
            "_id": 0
        }
    }
])
0 голосов
/ 27 мая 2020

Попробуй! ваш запрос почти правильный, но вам не хватает случая соответствия orderNumber.

  db.customerOrder.aggregate([ 
      {
       "$match":{
        "orders.staffNumber":"stf890"
        }
      },
      {
       $unwind:{
       "path":"$orders" 
       }
     },
     {
      "$match":{
      "orders.orderNumber":{$in:["ord004","ord005"]}  
      }
     },
     {
     "$project":{
      "orders.orderNumber":1,
      "_id":0
       }
     }
])
...