嵌入式文档MongoDB的最佳数据结构是什么?

2024-10-03 17:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我的每个用户都可以保存许多“智能搜索”:

user = {
    'username':'johncit',
    'smart_searches': [
        {'name':'last 24 hrs','terms':{'modifiedby':datetime(2012,1,1),'title':'foobar'}},
        {'name':'blabla','terms':{'title':'whatever','otherfield':500}}
            ]
        }

现在假设约翰找到了他的“无稽之谈”。我怎么得到条件?我可以得到John所有的智能搜索结果如下:

db.Users.find_one({
        'username':'johncit','smart_searches':{'$elemMatch':{'Name':'blabla'}}})

但这会返回整个文档,而不仅仅是“blabla”搜索的术语,这才是我真正需要的。那么,我是否必须找出客户端的确切术语?或者这是一个将“智能搜索”放在自己收藏中的案例?有更好的结构吗?你知道吗

我很想听听你的想法。你知道吗


Tags: 用户nametitlesmart智能username术语last
2条回答

您希望使用^{}投影运算符而不是查询运算符。你知道吗

db.Users.find_one(
    {'username':'johncit', 'smart_searches.name':'blabla'},
    {'username': 1, 'smart_searches': {'$elemMatch': {'name':'blabla'}}})

您不需要在查询对象中使用$elemMatch,因为您只匹配一个组件:name。你知道吗

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)

相关问题 更多 >