Как использовать findOneAndUpdate, используя агрегированный запрос в mongoDB? - PullRequest
0 голосов
/ 30 января 2020

Я использую гнездо JS в качестве бэкэнда, связанного с MongoDB. Я могу получить доступ к вложенному массиву в моей схеме:

  {
      "id": "productId",
      "name": "productName",
      "price": "productPrice",
      "Categories": [
          {
              "_id": "catId",
              "name": "catName",
              "Subcategories": [
                  {
                      "_id": "subcatId",
                      "name": "subcatName"
                  },
                  {
                      "_id": "subcatId",
                      "name": "subcatName"
                  },
              ]
          },
          {
              "_id": "catId",
              "name": "catName",
              "Subcategories": [
                  {
                      "_id": "subcatId",
                      "name": "subcatName"
                  },
                  {
                      "_id": "subcatId",
                      "name": "subcatName"
                  },
              ]
          }
      ]
  }
  ]

Я могу получить доступ к категориям и подкатегориям с помощью следующего:

db.collection.aggregate([
  {
    $match: {
      "id": "productId"
    }
  },
  {
    $unwind: "$Categories"
  },
  {
    $project: {
      "_id": "$Categories._id",
      "name": "$Categories.name"
    }
  }
])
db.collection.aggregate([
  {
    $match: {
      "id": "productId"
    }
  },
  {
    $unwind: "$Categories"
  },
  {
    $match: {
      "Categories._id": "catId"
    }
  },
  {
    $unwind: "$Categories.Subcategories"
  },
  {
    $project: {
      _id: "$Categories.Subcategories._id",
      name: "$Categories.Subcategories.name"
    }
  }
])

Проблема I Сейчас я сталкиваюсь с тем, как обновить категорию или подкатегорию, используя метод findOneAndUpdate.

Как мне go получить доступ к правильной категории / подкатегории _id для обновления?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Вы хотите использовать arrayFilters примерно так:

db.collection.updateOne(
    {  
        //query to match document
    },
    { $set: { "Categories.$[cat].name": newValue } }, //set name to new value in categories.

    { $set: { "Categories.Subcategories.$[subCat].name": newValue2 } }, //set name to new value in categories.
    { arrayFilters: [ { "cat._id": categoryId }, { "subCat._id": subCategoryId } ] }
)

Очевидно, что вы можете заменить поля name и _id для сопоставления и обновления любых других полей в объекте.

0 голосов
/ 30 января 2020

Вы можете обновить данные категории, как это,

Вы можете обновить точную ссылку, соответствующую вашему состоянию, используя .$ в вашем обновлении

db.collection.findOneAndUpdate({
    'id':"productId",
    'Categories._id':"catId1"
},{
    $set:{
        'Categories.$.name':"catName7"
    }
},{
    new:true
})

Мне придется проверить подкатегорию как два уровня вниз, я проверю и опубликую же поздно

...