我正在尝试从我的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'的任意组合和'标记'是可能的。
目标是返回每个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
答案 0 :(得分:0)
您需要使用$in
和$elemMatch
查询运算符。
ids = ['123', '456', '234', '534']
tags = ["Tag1", "Tag2", "Tag3"]
db.collection.find_one({
"Tag": { "$in": tags},
"ID": { "$elemMatch": { "$in": ids}}
})
答案 1 :(得分:-1)
您可以在一次传递中使用$in operator将数据库中“ID”数组中的项目与“ids”数组变量中的项目进行比较,对于标记也是如此。< / p>
使用$ in运算符匹配数组中的值
集合清单包含包含字段标记的文档,如下所示:
{ _id: 1, item: "abc", qty: 10, tags: [ "school", "clothing" ], sale: false }
然后,以下update()操作会将sale字段值设置为true,其中tags字段包含一个数组,其中至少有一个元素与“appliances”或“school”匹配。
db.inventory.update(
{ tags: { $in: ["appliances", "school"] } },
{ $set: { sale:true } }
)
在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})