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

时间:2016-08-19 15:10:00

标签: 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, '_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

2 个答案:

答案 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})