Python find_one()返回一个文档并给出字段组合

Python find_one()返回一个文档并给出字段组合,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,我正在尝试从我的mongodb返回一个文档(使用pymongo)。我希望查询返回给定id和标记的文档 ids = ['123', '456', '234', '534'] rows = [] for i in ids: for b in ["Tag1", "Tag2", "Tag3"]: temp = pb_db.db.collection.find_one({"ID": i, "Tag": b}, {'ID': 1, 'Tag': 1, 'Name': 1, '_cr

我正在尝试从我的mongodb返回一个文档(使用pymongo)。我希望查询返回给定id和标记的文档

ids = ['123', '456', '234', '534']

rows = []
for i in ids:
    for b in ["Tag1", "Tag2", "Tag3"]:
        temp = pb_db.db.collection.find_one({"ID": i, "Tag": b}, {'ID': 1, 'Tag': 1, 'Name': 1, '_created_at': 1})
        if temp is not None:
            rows.append(temp)
ID为“123”的文档可能有一条带有“Tag1”的记录和一条带有“Tag3”的单独文档。“ID”和“Tag”的任何组合都是可能的

目标是返回每个id、标记组合的一个实例(因此使用find_one()

目前,我上面的代码效率非常低,因为它每查询一个id就查询db三次(我的id列表比这个示例要大得多)。是否可以使用find_one()查询只返回一次具有给定id和每个标记的文档?谢谢

mongo结构示例:

{
    "_id" : "random_mongo_id",
    "Tag" : "Tag1",
    "_created_at" : ISODate("2016-06-25T00:00:00.000Z"),
    "ID" : [ 
        "123"
    ],
},
{
    "_id" : "random_mongo_id",
    "Tag" : "Tag2",
    "_created_at" : ISODate("2016-07-25T00:00:00.000Z"),
    "ID" : [ 
        "123"
    ],
},
{
    "_id" : "random_mongo_id",
    "Tag" : "Tag1",
    "_created_at" : ISODate("2016-07-25T00:00:00.000Z"),
    "ID" : [ 
        "534"
    ],
}
因此,在本例中,我希望看到:

ID: 123, Tag: Tag1
ID: 123, Tag: Tag2
ID: 534, Tag: Tag1

您可以通过使用将数据库中“ID”数组中的项与“ids”数组变量中的项进行比较,以及类似地对标记进行比较,从而在一次过程中完成此操作

使用$in运算符匹配数组中的值

集合清单包含包含字段标记的文档,如下所示:

然后,下面的update()操作将sale字段值设置为true,其中tags字段包含至少一个元素与“appliances”或“school”匹配的数组

在user3939059的情况下,查询如下:

ids = ['123', '456', '234', '534']
tags = ['Tag1', 'Tag2', 'Tag3']

pb_db.db.collection.find({"ID": {$in: ids}, "Tag": {$in: tags}}, {'ID': 1, 'Tag': 1, 'Name': 1, '_created_at': 1})
您需要使用和查询运算符

ids = ['123', '456', '234', '534']
tags = ["Tag1", "Tag2", "Tag3"]

db.collection.find_one({
    "Tag": { "$in": tags}, 
    "ID": { "$elemMatch": { "$in": ids}}
})

你能举一个数据库中数据结构的例子吗?在不知道查询的数据类型的情况下,很难分析查询。已更新原始数据post@user3939059是的,mongodb的findOne()查询使用与find()完全相同的查询语法。这不起作用,因为
ID
是OP文档中的数组。@Styvane否,它确实会将一个数组中的项与另一个数组中的项进行比较。我已经编辑了我的答案,以引用mongodb文档来解释如何进行测试。不幸的是,我进行了测试,但它没有返回任何结果。我要加倍check@user3939059我注意到的另一件事是,在变量中,ID是数字(123、456等),但在数据中它们似乎是字符串(“123”、“456”等)。这是故意的吗?谢谢你的回答,但是这个方法在应该返回批次时返回零结果
ids = ['123', '456', '234', '534']
tags = ['Tag1', 'Tag2', 'Tag3']

pb_db.db.collection.find({"ID": {$in: ids}, "Tag": {$in: tags}}, {'ID': 1, 'Tag': 1, 'Name': 1, '_created_at': 1})
ids = ['123', '456', '234', '534']
tags = ["Tag1", "Tag2", "Tag3"]

db.collection.find_one({
    "Tag": { "$in": tags}, 
    "ID": { "$elemMatch": { "$in": ids}}
})