简体   繁体   English

如何查找和更新 MongoDB 中的文档

[英]How to find and update a document in MongoDB

I am having a similar collection我有一个类似的收藏

db={
  collectionA: [
    {
      "id": ObjectId("63b7c24c06ebe7a8fd11777b"),
      "uniqueRefId": "UUID-2023-0001",
      "products": [
        {
          "productIndex": 1,
          "isProdApproved": false,
          "productCategory": ObjectId("63b7c24c06ebe7a8fd11777b"),
          "productOwners": [
            {
              _id: ObjectId("63b7c2fd06ebe7a8fd117781"),
              iApproved: false
            },
            {
              _id: ObjectId("63b7c2fd06ebe7a8fd117782"),
              iApproved: false
            }
          ]
        },
        {
          "productIndex": 2,
          "isProdApproved": false,
          "productCategory": ObjectId("63b7c24c06ebe7a8fd11777b"),
          "productOwners": [
             {
              _id: ObjectId("63b7c2fd06ebe7a8fd117781"),
              iApproved: false
            },
            {
              _id: ObjectId("63b7c2fd06ebe7a8fd117783"),
              iApproved: false
            }
          ]
        },
        {
          "productIndex": 3,
          "productCategory": "",
          "productOwners": ""
        }
      ]
    }
  ]
}

I want to find the productOwner whose _id is 63b7c2fd06ebe7a8fd117781 in the productOwners and update the isApproved and isprodApproved to true .我想在productOwners中找到_id63b7c2fd06ebe7a8fd117781productOwner并将isApprovedisprodApproved更新为true Other data will remain as it is.其他数据将保持原样。

I have tried this but it is only updating the first occurance我试过这个但它只是更新第一次出现

db.collectionA.update(
  {
    _id: ObjectId('63b7c24c06ebe7a8fd11777b'),
    'products.productOwners._id': ObjectId('63b7c2fd06ebe7a8fd117781'),
  },
  { $set: { 'products.$.productOwners.$[x].isApproved': true } },
  { arrayFilters: [{ 'x._id': ObjectId('63b7c2fd06ebe7a8fd117781') }] }
);

This one should work:这个应该工作:

db.collection.updateMany({},
   [
      {
         $set: {
            products: {
               $map: {
                  input: "$products",
                  as: "product",
                  in: {
                     $cond: {
                        if: { $eq: [{ $type: "$$product.productOwners" }, "array"] },
                        then: {
                           $mergeObjects: [
                              "$$product",
                              { isProdApproved: { $in: [ObjectId("63b7c2fd06ebe7a8fd117781"), "$$product.productOwners._id"] } },
                              {
                                 productOwners: {
                                    $map: {
                                       input: "$$product.productOwners",
                                       as: 'owner',
                                       in: {
                                          $mergeObjects: [
                                             "$$owner",
                                             { iApproved: { $eq: ["$$owner._id", ObjectId("63b7c2fd06ebe7a8fd117781")] } }
                                          ]
                                       }
                                    }
                                 }
                              }
                           ]
                        },
                        else: "$$product"
                     }
                  }
               }
            }
         }
      }
   ]
)

However, the data seem to be redundant.但是,数据似乎是多余的。 Better update only products.productOwners.iApproved and then derive products.isProdApproved from nested elements:最好只更新products.productOwners.iApproved ,然后从嵌套元素派生products.isProdApproved

db.collection.aggregate([
   {
      $set: {
         products: {
            $map: {
               input: "$products",
               as: "product",
               in: {
                  $cond: {
                     if: { $eq: [{ $type: "$$product.productOwners" }, "array"] },
                     then: {
                        $mergeObjects: [
                           "$$product",
                           { isProdApproved: { $anyElementTrue: ["$$product.productOwners.iApproved"] } },
                        ]
                     },
                     else: "$$product"
                  }
               }
            }
         }
      }
   }
])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM