mongodb元素匹配和更新查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb元素匹配和更新查询相关的知识,希望对你有一定的参考价值。

我有一个名为users的集合,详情如下

[{
"userId": "00UPQAARGT7",
"userPreferences": [{
    "pId": "59SDS64675A00096D48CB",
    "pData": [{
            "name": "FORMAT",
            "value": "CSV"
        },
        {
            "name": "LAN",
            "value": "E"
        }
    ]
},
{
    "pId": "59SDS64675A00096D59DB",
    "pData": [{
            "name": "FORMAT",
            "value": "DOC"
        },
        {
            "name": "LAN",
            "value": "N"
        }
    ]
}
]},
{
"userId": "02UPQAARST7",
"userPreferences": [
{
    "pId": "59SDS64675A00096D48DB",
    "pData": [{
            "name": "FORMAT",
            "value": "CSV"
        },
        {
            "name": "LAN",
            "value": "N"
        }
    ]
},
{
    "pId": "59SDS64675A00096D59DB",
    "pData": [{
            "name": "FORMAT",
            "value": "PPT"
        },
        {
            "name": "LAN",
            "value": "N"
        }
    ]
}
]}  
]

我想将userPreferences.pData.value设置为"TAB",其中userPreferences.pData.name"FORMAT"userPreferences.pData.value"FRN",其中userPreferences.pData.name"LAN"但是想要应用条件userId["00UPQAARGT7", "02UPQAARST7"]userPreferences.pId["59SDS64675A00096D48CB","59SDS64675A00096D59DB"]

任何帮助如何在mongodb中进行单一查询

我正在使用mongodb 3.4.1版本

答案

您不能以您希望的方式执行此操作,原因有两个:

  1. 在MongoDB 3.4中,positional operator '$'仅匹配第一个找到的子文档。这已在v3.6中进行了更改,您现在可以使用$[]语法来定位所有匹配的子文档。
  2. 截至今天,您无法在任何版本的MongoDB中指定条件更新。但是有一个开放的功能要求:https://jira.mongodb.org/browse/SERVER-6566

所以你基本上留下了在客户端进行更改的旧的(不幸的是更慢)替代方案,你可以找到大量的例子,例如:这里:

MongoDB update multiple subdocuments with or query

Update all sub-documents inside document mongodb

以上是关于mongodb元素匹配和更新查询的主要内容,如果未能解决你的问题,请参考以下文章

在Java中查询具有完全匹配字段MongoDB的数组元素

MongoDB:查询以匹配数组中的每个元素与条件

MongoDB查询以选择具有所有元素都匹配某些条件的数组的文档

MongoDB 数组字段的查询和更新

MongoDB计数按数组元素分组的数组中的匹配字符串

MongoDB 使用 $and 和切片和匹配