gpt4 book ai didi

python - 从文档中检索单个属性

转载 作者:太空宇宙 更新时间:2023-11-03 19:13:41 25 4
gpt4 key购买 nike

大家好。假设我们有一个集合和一个文档,如下所示:

    test_doc = {
"ID" : "123",
"a" : [
{
'x' : "/",
'y' : "2000",
'z' : "1000"
},
{
'x' : "/var",
'y' : "3500",
'z' : "3000"
}
]

}

我需要的是检索单个属性 a.z 。在 MongoDB 中,我使用以下查询:

db.testcol.find({"ID":"123","a.x":"/"},{'a.z':1})

返回:

{ "_id" : ObjectId("skipped"), "a" : [ { "z" : "1000" }, { "z" : "3000" } ] }

如您所见,它返回所有 z 属性,但当条件为 {"ID":"123","a.x":"/var"} 时,我只需要第一个或第二个属性那么,问题是:在这种情况下我如何获得单一属性(property)?这只是一个糟糕的设计问题还是我应该以某种方式处理代码中返回的文档(python)?任何建议将不胜感激。

最佳答案

在 MongoDB 2.0 及更早版本中,这是不可能的。您想要做的是返回数组的特定元素 - 但这不是您的投影实际执行的操作,它只会返回整个数组,然后返回每个数组的 z 元素。

但是,在 2.2(撰写此答案时为 rc2)中,情况变得更好了。您现在可以使用$elemMatch作为投影的一部分(有关详细信息,请参阅 SERVER-2238),以便您只拉回所需的数组元素。所以,尝试这样的事情:

db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

或者,只需在投影本身中使用 $elemMatch,您可能认为这更干净:

db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

所以,现在,至少返回的数组只是包含您想要的条目的数组,您可以简单地引用相关的 z 元素(尚不支持子文档上的 elemMatch 投影)。

最后但并非最不重要的一点是,在 2.2 中我们有了聚合框架,它可以做的事情之一(使用 $project 运算符)是 reshape 文档并更改子文档和数组元素进入顶级数组。要获得所需的结果,您可以执行以下操作:

db.foo.aggregate( 
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)

结果如下所示:

{ "result" : [ { "z" : "1000" } ], "ok" : 1 }

关于python - 从文档中检索单个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com