добавить новое поле в проекции mongoDB - PullRequest
1 голос
/ 05 июня 2019

У меня есть коллекция монго (информация о магазине), как показано ниже ...

{
    _id: "",
    storeName: "store1",
    items: [
        {
            itemName: "mongo",
            itemPrice: 20,
            itemAvailablity: 100 
        },
        {
            itemName: "apples",
            itemPrice: 50,
            itemAvailablity: 70 
        }
    ]
},
{
    _id: "",
    storeName: "store2",
    items: [
        {
            itemName: "banana",
            itemPrice: 10,
            itemAvailablity: 30 
        },
        {
            itemName: "apple",
            itemPrice: 45,
            itemAvailablity: 90 
        }
    ]
},
{
    _id: "",
    storeName: "store3",
    items: [
        {
            itemName: "apple",
            itemPrice: 10,
            itemAvailablity: 30 
        },
        {
            itemName: "mongo",
            itemPrice: 30,
            itemAvailablity: 50 
        }
    ]
}

Исходя из приведенных выше данных, я хочу получить сведения о конкретном элементе вместе с storeName.

Если я хочу получить "монго" детали из всех магазинов, тогда мой ожидаемый результат будет примерно равен

[
    {
        itemName: "mongo",
        itemPrice: 20,
        itemAvailablity: 100,
        storeName: "store1"
    },
    {
        itemName: "mongo",
        itemPrice: 30,
        itemAvailablity: 50,
        storeName: "store3" 
    }
]

Я пытаюсь с разными запросами агрегации монго, но я не получил вывод, как я ожидаю

Кто-нибудь может мне помочь из этого

спасибо

Ответы [ 3 ]

2 голосов
/ 05 июня 2019

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$match": { "items.itemName": "mongo" }},
  { "$unwind": "$items" },
  { "$match": { "items.itemName": "mongo" }},
  { "$addFields": { "items.storeName": "$storeName" }},
  { "$replaceRoot": { "newRoot": "$items" }}
])

MongoPlayground

Или вы можете сделать это так

db.collection.aggregate([
  { "$match": { "items.itemName": "mongo" }},
  { "$addFields": {
    "items": {
      "$map": {
        "input": {
          "$filter": {
            "input": "$items",
            "as": "item",
            "cond": { "$eq": ["$$item.itemName", "mongo"]}
          }
        },
        "as": "item",
        "in": { "$mergeObjects": ["$$item", { "storeName": "$storeName" }] }
      }
    }
  }},
  { "$unwind": "$items" },
  { "$replaceRoot": { "newRoot": "$items" }}
])

MongoPlayground

1 голос
/ 05 июня 2019

Вы можете достичь этого с помощью этой агрегации:

db.collection.aggregate([
  {
    $project: {
      storeName: "$$CURRENT.storeName",
      items: {
        $filter: {
          input: "$items",
          as: "item",
          cond: { $eq: ["$$item.itemName","mongo"] }
        }
      }
    }
  },
  { $unwind: "$items" },
  { $addFields: { "items.storeName": "$storeName"} },
  { $replaceRoot: { newRoot: "$items" }}
])

Вы можете видеть это здесь работает

0 голосов
/ 05 июня 2019
  db.collection.aggregate(

        // Pipeline
        [
            // Stage 1
            {
                $match: {
                    items: {
                        $elemMatch: {
                            "itemName": "mongo"
                        }
                    }
                }
            },

            // Stage 2
            {
                $project: {
                    items: {
                        $filter: {
                            input: "$items",
                            as: "item",
                            cond: {
                                $eq: ["$$item.itemName", 'mongo']
                            }
                        }
                    },

                    storeName: 1

                }
            },

            // Stage 3
            {
                $addFields: {
                    "items.storeName": '$storeName'
                }
            },

        ]



    );
...