假设我的每个用户都可以保存许多“智能搜索”:
user = {
'username':'johncit',
'smart_searches': [
{'name':'last 24 hrs','terms':{'modifiedby':datetime(2012,1,1),'title':'foobar'}},
{'name':'blabla','terms':{'title':'whatever','otherfield':500}}
]
}
现在约翰打他的'blabla'搜索。我如何获得条款?我可以得到所有John的智能搜索:
db.Users.find_one({
'username':'johncit','smart_searches':{'$elemMatch':{'Name':'blabla'}}})
但这会返回整个文档,而不仅仅是'blabla'搜索的术语,这是我真正需要的。那么我是否必须在客户端找出准确的术语?或者这是将“smart_searches”放入自己的收藏中的情况?有更好的结构吗?
我很想听听你的想法。
答案 0 :(得分:2)
Positional operator会做到这一点
> db.Users.find({'username':'johncit','smart_searches':{'$elemMatch':{'name':'blabla'}}},{'smart_searches.$.terms':1}).pretty()
{
"_id" : ObjectId("5099ab303d550a068f16d5c5"),
"smart_searches" : [
{
"name" : "blabla",
"terms" : {
"title" : "whatever",
"otherfield" : 500
}
}
]
}
<强>更新强>
要使用位置运算符更新术语,可以编写
db.Users.update({'username':'johncit',
'smart_searches':{'$elemMatch':{'name':'blabla'}}},
{$set:{'smart_searches.$.terms':{title:'changed',otherfield:200}}},
false,true)
答案 1 :(得分:0)
您想使用$elemMatch
投影运算符而不是查询运算符。
db.Users.find_one(
{'username':'johncit', 'smart_searches.name':'blabla'},
{'username': 1, 'smart_searches': {'$elemMatch': {'name':'blabla'}}})
您不需要在查询对象中使用$elemMatch
,因为您只匹配一个组件:name
。