добавить уникальный объект на основе его ключа во встроенный документ mongodb - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь добавить только уникальный объект на основе 1 ключа ie 'variableName' во встроенный документ ie 'variable' в нашем случае. Я использую mon goose api, чтобы сделать это в nodejs.

Образец документа:

{
  "botname": "bot1",
  "variables": [
    {
      "variableName": "variable1",
      "variableValue": "value"
    },
    {
      "variableName": "variable2",
      "variableValue": "value"
    },
    {
      "variableName": "variable3",
      "variableValue": "value"
    }
  ]
}

Здесь, в приведенном ниже коде, поле "имя_папки" находит спецификацию c документ из БД и внутри этого документа я пытаюсь добавить объект, основанный на уникальном variableName. У меня sh нет двух объектов с одинаковым значением variableName.

Теперь, когда я пытаюсь добавить новый объект внутри массива выше, происходит дублирование. Я также попытался $ addOnSet, но не сработало.

findOneAndUpdate({ "botname": req.params.botName },
      { $push: { variables: {"variableName" : req.body.variableName, "value": req.body.value}} });

1 Ответ

1 голос
/ 05 мая 2020

Как упомянуто в комментариях prasad_, вы можете рассмотреть возможность использования дополнительного фильтра.

Чтобы достичь желаемого результата, настройте запрос, убедившись, что он не содержит искомого значения variableName. Добавление "variables.variableName": { $ne: "variable1" к вашему запросу - один из способов достижения этого.

> db.test.findAndModify({query: {"botname":"bot1", "variables.variableName": { $ne: "variable1" }}, update: {$push: { variables: { variableName: "variable1", variableValue: "BADDDD"}}}})
< ERROR: No document was found matching the query and sort. When sorting, all attributes need to be present in the document.

Когда я пытаюсь указать правильное значение, оно работает!

> db.test.findAndModify({query: {"botname":"bot1", "variables.variableName": { $ne: "variable4" }}, update: {$push: { variables: { variableName: "variable4", variableValue: "Gooood"}}}})
Operation consumed 15.76 RUs
{
    "_id" : ObjectId("5eb093cc7791b6157023b066"),
    "botname" : "bot1",
    "variables" : [
        {
            "variableName" : "variable1",
            "variableValue" : "value"
        },
        {
            "variableName" : "variable2",
            "variableValue" : "value"
        },
        {
            "variableName" : "variable3",
            "variableValue" : "value"
        }
    ]
}
> db.test.find({})
Operation consumed 2.28 RUs
{
    "_id" : ObjectId("5eb093cc7791b6157023b066"),
    "botname" : "bot1",
    "variables" : [
        {
            "variableName" : "variable1",
            "variableValue" : "value"
        },
        {
            "variableName" : "variable2",
            "variableValue" : "value"
        },
        {
            "variableName" : "variable3",
            "variableValue" : "value"
        },
        {
            "variableName" : "variable4",
            "variableValue" : "Gooood"
        }
    ]
}

Убедитесь, что у вас есть индекс на botname, чтобы избежать сканирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...