Python 多维addToSet/Push mongodb
我想创建一个多维集合。 该集合具有多个位置。每个位置都有用户,每个用户都有照片 目前,该系列的位置如下:Python 多维addToSet/Push mongodb,python,mongodb,pymongo,Python,Mongodb,Pymongo,我想创建一个多维集合。 该集合具有多个位置。每个位置都有用户,每个用户都有照片 目前,该系列的位置如下: { "_id" : ObjectId( "52148266c36b4403e855bef9" ), "latitude" : 48.958, "id" : "110600715", "longitude" : 9.13, "name" : "Coffee" } 我的最终结果应该是: { "_id" : ObjectId( "52148266c36b4403e855bef9"
{ "_id" : ObjectId( "52148266c36b4403e855bef9" ),
"latitude" : 48.958,
"id" : "110600715",
"longitude" : 9.13,
"name" : "Coffee" }
我的最终结果应该是:
{ "_id" : ObjectId( "52148266c36b4403e855bef9" ),
"latitude" : 48.958,
"id" : "110600715",
"longitude" : 9.13,
"name" : "Coffee",
'users' : [
{
'user' : 45,
'username' : 'Me',
'user_fullname': 'Name Lastname',
'photos': [
{
'photo_id' : 10,
'created_time' : 1236456712,
'link' : 'http...',
'image' : 'http...',
'tags' : 'a'
},
{...}
] # end of photos list
},
{...}
] #end of users list
}
如果用户不存在,请创建新用户并添加第一张图片。
如果用户存在,请添加下一张具有唯一photo\u id
的图片
这是我试过的一个例子。我正在使用pymongo和python。我知道我丢失了第二个$addToSet
或类似的东西
db.col.update( {'_id':location_id['_id']},
{ '$addToSet' :
{
'user' : int(i['user']['id']),
'username' : i['user']['username'],
'user_fullname': i['user']['full_name'],
'photos':
{
'photo_id' : i['id'],
'created_time' : int(i['created_time']),
'link' : i['link'],
'image' : i['images']['url'],
'tags' : i['tags']
}
}
}
)
您不能在单个操作中完成此操作-您可以执行更新并检查更新的数量 在这里,我们使用默认的写关注点(来自MongoClient),例如:
w:1
,我们首先查询并期望有用户提供位置:
result = db.col.update(
{'_id':location_id['_id'], "users": {"$elemMatch": {'user' : int(i['user']['id'])}}},
{'$addToSet': {"photos": {'photo_id' : i['id'],
'created_time' : int(i['created_time']),
'link' : i['link'],
'image' : i['images']['url'],
'tags' : i['tags']}}});
如果结果['n']等于0,则表示我们不匹配,并且该位置没有用户i[user]
。因此,我们也可以使用$addToSet
if result['n'] == 0:
db.col.update({'_id':location_id['_id']},
{ '$addToSet' :
{
'user' : int(i['user']['id']),
'username' : i['user']['username'],
'user_fullname': i['user']['full_name'],
'photos':
[{'photo_id' : i['id'],
'created_time' : int(i['created_time']),
'link' : i['link'],
'image' : i['images']['url'],
'tags' : i['tags']
}]
}
});
注意:
当我们在做两个操作时,有一个理论上的竞争条件,这可能意味着第二次更新不会更新任何内容,因为其他线程已经将用户添加到该位置。如果您想确保它确实更新了,您应该仔细检查第二次更新的结果,然后可能会进行循环。这取决于此竞赛条件的真实程度。可能重复的