根据条件查找MongoDB文档中的特定字段

xfb7svmp  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(161)

我有下面的MongoDB文档,就像这一个:

{
        "_id": "ABC",
        "properties":
        [
            {
                "_id": "123",
                "weight":
                {
                    "$numberInt": "0"
                },
                "name": "Alice"
            },
            {
                "_id": "456",
                "weight":
                {
                    "$numberInt": "1"
                },
                "name": "Bob"
            },
            {
                "_id": "789",
                "weight":
                {
                    "$numberInt": "1"
                },
                "name": "Charlie"
            }
        ]
    }

我希望找到名称为“Alice”的属性的_id,或名称为“$numberInt”的属性的_id:“0”表示。
我用的是pymongo。
以下做法:

from pymongo import MongoClient
    mongo_client = MongoClient("mymongourl")
    mongo_collection = mongo_client.mongo_database.mongo_collection
    
    mongo_collection.find({'properties.name': 'Alice'}, {'properties': 1})[0]['_id']

给出first _id(“123”)但由于我对文档进行了筛选,如果Alice位于properties数组的第二个元素(_id:“456”)我可能会错过她。对于与具有指定名称的元素相关联的specific _id,哪种方法最好?

laik7k3q

laik7k3q1#

您可以简单地使用$reduce来迭代properties数组。如果_id字段符合您的条件,则有条件地存储它。

db.collection.aggregate([
  {
    "$addFields": {
      "answer": {
        "$reduce": {
          "input": "$properties",
          "initialValue": null,
          "in": {
            "$cond": {
              "if": {
                $or: [
                  {
                    $eq: [
                      "$$this.name",
                      "Alice"
                    ]
                  },
                  {
                    $eq: [
                      "$$this.weight",
                      0
                    ]
                  }
                ]
              },
              "then": "$$this._id",
              "else": "$$value"
            }
          }
        }
      }
    }
  }
])

Mongo Playground

相关问题