Python find_one()返回一个文档并给出字段组合
我正在尝试从我的mongodb返回一个文档(使用pymongo)。我希望查询返回给定id和标记的文档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
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}}
})