【问题标题】:MongoDB query with $elemMatch使用 $elemMatch 的 MongoDB 查询
【发布时间】:2016-02-20 00:34:45
【问题描述】:

我正在尝试使用 tornado 和 python 从 MongoDB 集合中检索值。

我为搜索提供的值在列表中,我希望列出整个集合,但给定值以外的值不得显示在列表变量中。

我在表格中的数据:

{
    "_id" : ObjectId("564b313b3f32df05fc905570"),
    "RequiredDate" : "17-11-2015",
    "RequestedDate" : "17-11-2015",
    "Pid" : [
            "564b22373f32df05fc905564",
            "5630baac3f32df134c18b682"
    ],
    "email" : "abishek@gmail.com",
    "UName" : "abishek",
    "Uid" : "564b21003f32df05fc905563",
    "phone" : "9988776655",
    "PName" : [
            "balu",
            "prakash"
    ],
    "Registration" : [
            "TN 45 AG 5688",
            "TN 45 AS 5655"
    ],
    "Rid" : "564b313b3f32df05fc905570"
}

我的查询:

db.collection.find({"Rid" : "564b313b3f32df05fc905570"},{"Pid": {$elemMatch:{"Pid":"5630baac3f32df134c18b682","Registration": "TN 45 AS 5655"}}},{"_id": false}).pretty()

想要的输出是:

{
    "_id" : ObjectId("564b313b3f32df05fc905570"),
    "RequiredDate" : "17-11-2015",
    "RequestedDate" : "17-11-2015",
    "Pid" : "5630baac3f32df134c18b682",
    "email" : "abishek@gmail.com",
    "UName" : "abishek",
    "Uid" : "564b21003f32df05fc905563",
    "phone" : "9988776655",
    "PName" : [
            "balu",
            "prakash"
    ],
    "Registration" : "TN 45 AS 5655",
    "Rid" : "564b313b3f32df05fc905570"
}

$elemMatch 是获取输出的正确方法,还是有其他方法可以实现所需的输出。


说明:

在建议的答案中,列表中有一个 JSON 对象,这里我有一个特定的值,只有 Pid 知道从另一个表接收的注册值与此特定记录中的注册值匹配,并且然后显示为单个记录,而不显示其他 Pid 和注册。 而且我在输出中只得到_id,而不是整个修改后的记录。

【问题讨论】:

  • @AnirudhModi 有一个$elemMatch 版本用于投影而不是作为查询运算符。但是“投影”的一般情况是您需要包含地指定“所有内容”或仅排除您不想要的内容。因此,如果您想要“所有字段”,那么您必须要求“所有字段”。
  • 我误解了这个问题..感谢您的链接..我认为这是不可能的..
  • db.collection.find({"Rid" : "564b313b3f32df05fc905570"},{"Pid": {$elemMatch:{"Pid":"5630baac3f32df134c18b682"}},"注册":{$ elemMatch:{"Registration": "TN 45 AS 5655"}}},{"_id": false}).pretty() 您在 pid 的 elemMatch 中使用了注册,但可能没有给您想要的结果。
  • @AnirudhModi 在输出 { "_id" : ObjectId("564b313b3f32df05fc905570") } 中只得到这个

标签: python mongodb mongodb-query


【解决方案1】:

下面的查询几乎给出了你所追求的,但是,它没有将PidRegistration 存储在一个数组中。如果需要,您可以使用 $group 语句和 $push 组合创建此数组,但是,您必须在 group 语句中包含所有字段。

db.collection.aggregate([{$match:{"Rid" : "564b313b3f32df05fc905570"}},
{$unwind:"$Pid"},
{$unwind:"$Registration"},
{$match:{"Pid" : "5630baac3f32df134c18b682"}},
{$match:{"Registration" : "TN 45 AS 5655"}}])

您可以使用$project过滤数据:

db.data.aggregate([{$match:{"Rid" : "564b313b3f32df05fc905570"}},
{$unwind:"$Pid"},
{$unwind:"$Registration"},
{$match:{"Pid" : "5630baac3f32df134c18b682"}},
{$match:{"Registration" : "TN 45 AS 5655"}},
{$project:{"_id":0,"Rid":1,"Pid":1,"Registration":1}}])

如果此查询返回重复项,如您的评论中所述,您可以添加另一个 $group 语句以删除重复项:

db.data.aggregate([{$match:{"Pid" : "5630baac3f32df134c18b682"}},
{$unwind:"$Pid"},
{$unwind:"$Registration"},
{$match:{"Pid" : "5630baac3f32df134c18b682"}},
{$match:{"Registration" : "TN 45 AS 5655"}},
{$project:{"_id":0,"Rid":1,"Pid":1,"Registration":1}},
{$group:{"_id":{"Rid":"$Rid","Pid":"$Pid","Registration":"$Registration"}}},
{$project:    {"_id":0,"Rid":"$_id.Rid","Pid":"$_id.Pid","Registration":"$_id.Registration"}},

])

【讨论】:

  • 我可以从显示中排除某些值,例如_id。因为_id 给出了一个 json object not serialized 错误。通常我在我的代码中使用{"_id": False}。是否有可能是因为在使用投影时出现错误
  • 您可以使用$project 过滤值。我在回答中包含了一个示例 $project
  • 我在for 循环中使用您的代码,其中Registration 的值会发生变化,但在输出中值会重复您知道为什么吗?我使用Pid 来匹配两次而不是Rid
  • Pid 是常量,只有 Registration 值变化
  • 你有重复吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多