Как упомянуто в комментариях 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
, чтобы избежать сканирования.