mongodb Pymongo“and”运算符未过滤查询结果[重复]

dced5bon  于 2023-01-30  发布在  Go
关注(0)|答案(1)|浏览(137)
    • 此问题在此处已有答案**:

(17个答案)
3天前关闭。
我有这个monogdb模式:

groups = {
    "bsonType": "object",
    "required": [
        "created_at", "group_name", "owner",
        "members", "currency", "country",
        "group_username"
    ],
    "properties": {
        "created_at": {
            "bsonType": "date",
            "description": "The date and time when the group was created"
        },
        "group_name": {
            "bsonType": "string",
            "description": "Name of group"
        },
        "group_username": {
            "bsonType": "string",
            "description": "groups username"
        },
        "country": {
            "bsonType": "string",
            "description": "User's country and is required"
        },
        "currency": {
            "bsonType": "string",
            "description": "User's currency type and is required"
        },
        "description": {
            "bsonType": "string",
            "description": "Brief description of what the group does"
        },
        "block": {
            "bsonType": "bool",
            "description": "Field to check if user disabled from group activity"
        },
        "owner": {
            "bsonType": "object",
            "required": ["user_id", "status"],
            "properties": {
                "user_id": {
                    "bsonType": "objectId",
                    "description": "User id of the owner of the group"
                },
                "status": {
                    "bsonType": "string",
                    "description": "Default value is 'owner'",
                }
            },

        },
        "group_invite_link": {
            "bsonType": "string",
            "description": "Link used to invite new members"
        },
        "members": {
            "bsonType": "array",
            "items": {
                "bsonType": "object",
                "required": ["user_id", "name", "status", "confirmed", "joined_at"],
                "properties": {
                    "user_id": {
                        "bsonType": "objectId"
                    },
                    "name": {
                        "bsonType": "string",
                        "description": "Name of group member"
                    },
                    "status": {
                        "enum": ["admin", "member"],
                        "description": "can only be one of the enum values and is required"
                    },
                    "confirmed": {
                        "bsonType": "bool",
                        "description": "Confirms if user is fully authorized to operate in group"
                    },
                    "joined_at": {
                        "bsonType": "date",
                        "description": "Date user joined group"
                    }
                }
            }

        },
        "group_wallet_id": {
            "bsonType": "objectId",
            "description": "Id of wallet associated with group"
        }
    }

}

我正在查询它,以便只返回与以下查询匹配的文档:

db.groups.find({
            "$and": [
                {
                    "members.user_id": ObjectId(user_id)
                },
                {
                    "members.confirmed": True
                }

            ]
        })

它返回以下内容:

{
"sucess": true,
"message": "Users groups",
"data": [
    {
        "_id": "63987c4263d7eba1e79a1df1",
        "created_at": "2022-12-13 13:21:03",
        "group_name": "Demo 1",
        "is_owner": true,
        "balance": {
            "$numberDecimal": "250.00"
        },
        "members": [
            {
                "user_id": "63987b7c63d7eba1e79a1dd7",
                "name": "Joy Kudosen",
                "status": "admin",
                "confirmed": true,
                "joined_at": "2022-12-13 13:21:03"
            },
            {
                "user_id": "63987b7c63d7eba1e79a1dd8",
                "name": "Joy Kudosen",
                "status": "member",
                "confirmed": true,
                "joined_at": "2022-12-14 13:22:03"
            },
            {
                "user_id": "63987b7c63d7eba1e79a1dd7",
                "name": "Joy Kudosen",
                "status": "admin",
                "confirmed": true,
                "joined_at": "2022-12-14 11:05:39"
            }
        ]
    },
    {
        "_id": "63987c5a63d7eba1e79a1df4",
        "created_at": "2022-12-13 13:21:27",
        "group_name": "Demo 2",
        "is_owner": true,
        "balance": {
            "$numberDecimal": "100"
        },
        "members": [
            {
                "user_id": "63987b7c63d7eba1e79a1dd7",
                "name": "Joy Kudosen",
                "status": "admin",
                "confirmed": true,
                "joined_at": "2022-12-13 13:21:27"
            }
        ]
    },
    {
        "_id": "6399ae06ebaca8cd5fbcd639",
        "created_at": "2022-12-14 11:05:39",
        "group_name": "Demo 4",
        "is_owner": true,
        "balance": {
            "$numberDecimal": "0"
        },
        "members": [
            {
                "user_id": "63987b7c63d7eba1e79a1dd7",
                "name": "Joy Kudosen",
                "status": "admin",
                "confirmed": true,
                "joined_at": "2022-12-14 11:05:39"
            }
        ]
    },
    {
        "_id": "63d1810699edcb7379f21c27",
        "created_at": "2023-01-25 19:20:33",
        "group_name": "Hello world",
        "is_owner": false,
        "balance": {
            "$numberDecimal": "0"
        },
        "members": [
            {
                "user_id": "63d180c399edcb7379f21c23",
                "name": "Joy Kudosen",
                "status": "admin",
                "confirmed": true,
                "joined_at": "2023-01-25 19:20:33"
            },
            {
                "user_id": "63987b7c63d7eba1e79a1dd7",
                "name": "Joy Kudosen",
                "status": "member",
                "confirmed": false,
                "joined_at": "2023-01-25 19:23:31"
            }
        ]
    }
]

}
我只想返回与用户id匹配的数组对象,并且在members数组中的"confirmed"值为"true",如下所示:

{
    "sucess": true,
    "message": "Users groups",
    "data": [
        {
            "_id": "63987c4263d7eba1e79a1df1",
            "created_at": "2022-12-13 13:21:03",
            "group_name": "Demo 1",
            "is_owner": true,
            "balance": {
                "$numberDecimal": "250.00"
            },
            "members": [
                {
                    "user_id": "63987b7c63d7eba1e79a1dd7",
                    "name": "Joy Kudosen",
                    "status": "admin",
                    "confirmed": true,
                    "joined_at": "2022-12-13 13:21:03"
                },
                {
                    "user_id": "63987b7c63d7eba1e79a1dd8",
                    "name": "Joy Kudosen",
                    "status": "member",
                    "confirmed": true,
                    "joined_at": "2022-12-14 13:22:03"
                },
                {
                    "user_id": "63987b7c63d7eba1e79a1dd7",
                    "name": "Joy Kudosen",
                    "status": "admin",
                    "confirmed": true,
                    "joined_at": "2022-12-14 11:05:39"
                }
            ]
        },
        {
            "_id": "63987c5a63d7eba1e79a1df4",
            "created_at": "2022-12-13 13:21:27",
            "group_name": "Demo 2",
            "is_owner": true,
            "balance": {
                "$numberDecimal": "100"
            },
            "members": [
                {
                    "user_id": "63987b7c63d7eba1e79a1dd7",
                    "name": "Joy Kudosen",
                    "status": "admin",
                    "confirmed": true,
                    "joined_at": "2022-12-13 13:21:27"
                }
            ]
        },
        {
            "_id": "6399ae06ebaca8cd5fbcd639",
            "created_at": "2022-12-14 11:05:39",
            "group_name": "Demo 4",
            "is_owner": true,
            "balance": {
                "$numberDecimal": "0"
            },
            "members": [
                {
                    "user_id": "63987b7c63d7eba1e79a1dd7",
                    "name": "Joy Kudosen",
                    "status": "admin",
                    "confirmed": true,
                    "joined_at": "2022-12-14 11:05:39"
                }
            ]
        }
    ]
}

我使用了不同形式的查询,但无法筛选出"hello world"组信息。我尝试了聚合和"or"操作,但仍然得到相同的结果。

7qhs6swi

7qhs6swi1#

"$elemMatch"用于查找与数组元素中的多个字段匹配的文档。
例如,像这样:

db.groups.find({
  "members": {
    "$elemMatch": {
      "user_id": "63987b7c63d7eba1e79a1dd7",
      "confirmed": true
    }
  }
})

mongoplayground.net上试试。

相关问题