Одним из возможных решений является изменение документа запроса, чтобы утверждать, что данный твитид еще не находится в массиве «tweetsid». Если это так, запрос не будет соответствовать, и обновление не будет выполнено.
Вот пример использования оболочки JS. Трудно дать точный ответ без примерного документа, поэтому я догадался о структуре вашего документа. Надеюсь, это достаточно близко, поэтому пример вам подходит.
> db.hcoll.save({_id:1, hashtag:"myHashTag", count:0, tweetsid:[]})
> db.hcoll.find()
{ "_id" : 1, "hashtag" : "myHashTag", "count" : 0, "tweetsid" : [ ] }
Следующая обновление добавит «ID1» в «tweetsid» массива и увеличить значение «счетчика на 1»
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}})
> db.hcoll.find()
{ "_id" : 1, "count" : 1, "hashtag" : "myHashTag", "tweetsid" : [ "id1" ] }
Если обновление выполняется снова, «рассчитывать» не будет быть увеличено, потому что часть запроса {tweetsid:{$ne:"id1"}}
не соответствует.
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}})
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}})
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}})
> db.hcoll.find()
{ "_id" : 1, "count" : 1, "hashtag" : "myHashTag", "tweetsid" : [ "id1" ] }
>
я вижу из вашего поста, что вы выполняете обновление с upsert = True, указывая, что вы хотели бы, чтобы документ, который будет создан, если он не существует. К сожалению, обновление, которое я представил, не будет работать с upsert, потому что если новое значение «tweetsid» находится в массиве «tweetsid», запрос не будет соответствовать, и upsert создаст новый документ.
> db.hcoll.update({hashtag:"myHashTag", tweetsid:{$ne:"id1"}}, {$addToSet:{"tweetsid":"id1"}, $inc:{"count":1}}, true, false)
> db.hcoll.find()
{ "_id" : 1, "count" : 1, "hashtag" : "myHashTag", "tweetsid" : [ "id1" ] }
{ "_id" : ObjectId("4f91ae48f48744310eab90d2"), "count" : 1, "hashtag" : "myHashTag", "tweetsid" : [ "id1" ] }
>
Надеемся, что вышеизложенное предоставит вам некоторые идеи и поможет вам найти решение.
Это было очень полезно, и вы дали мне идею, как это сделать! Благодаря! –