MongoDB Stitch - Как сохранить тип данных в int (без изменения в double) при увеличении с обновлением? - PullRequest
0 голосов
/ 10 февраля 2020

Я использую стежок в mongodb. В стежке я пишу одну nodejs функцию для увеличения и уменьшения.

if(changeEvent.fullDocument.type == 'article' || changeEvent.fullDocument.type == 'poll' ) {
  context.functions.execute("notifyTopic", "article-created", changeEvent.fullDocument);
  var communities = context.services.get("mongodb-atlas").db("utilo").collection("communities");
  communities.updateOne(
    {_id:changeEvent.fullDocument.community},
    {$inc: {"summary.postCount":NumberInt(1)}, $currentDate: {"summary.lastActivity":true} }
  )
} else if (changeEvent.fullDocument.type == 'comment') {
  context.functions.execute("notifyTopic", "comment-created", changeEvent.fullDocument);
  var posts = context.services.get("mongodb-atlas").db("utilo").collection("posts");
  posts.updateOne(
    {_id:changeEvent.fullDocument.root},
    {$inc: {"summary.commentCount":1}, $currentDate: {"summary.lastActivity":true} }
  )

Теперь я выполнил эту функцию, значение summary.postCount, преобразованное из int в Double, я использую NumberInt также .

 posts.updateOne(
    {_id:changeEvent.fullDocument.root},
    {$inc: {"summary.commentCount":NumberInt(1)}, $currentDate: {"summary.lastActivity":true} }
  )

communities.updateOne(
    {_id:changeEvent.fullDocument.community},
    {$inc: {"summary.postCount":NumberInt(-1)}, $currentDate: {"summary.lastActivity":true} }
  )

это не рабочее событие, я также упомянул "summary. $. PostCount", но это бесполезно.

Мне нужны только значения увеличения / уменьшения и целочисленный тип данных. Пожалуйста, помогите мне с решением. Заранее спасибо.

1 Ответ

0 голосов
/ 10 февраля 2020

Проверьте это:

  1. Вы правы, когда вы сделаете это {$inc: {"summary.commentCount":1}, оно конвертирует любое поле Int32 в Double.
  2. Итак, сначала вы должны были попробовать {$inc: {"summary.commentCount":NumberInt(1)}.
  3. Теперь он уже преобразован в удвоение для дальнейших запросов, используя шаг 2, бесполезно. Вам необходимо установить в своем поле исходный тип данных и затем go, чтобы продолжить дальнейшие операции.

На MongoDB v > 4.2 вы можете запустить конвейер агрегации в update(), чтобы обновить все документы от double до int в поле postCount.

db.collection.update(
    {},
    [
        { $set: { postCount: { $toInt: '$postCount' } } }
    ], false, true // 1) false is {upsert : false}, 2) is {multi : true}
)

Если вы используете MongoDB v < 4.2, вам может понадобиться найти способ обновить все документы соответствующими значениями, например, прочитать, манипулировать данными и обновить используя .bulkWrite () или .updateMany () .

...