Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb$在嵌套文档上拉取_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb$在嵌套文档上拉取

Mongodb$在嵌套文档上拉取,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一套像这样的记录 { "recordId" : "5a65d212-774e-4208-8cb4-bf4e92e80898", "recordName" : "recordABC", "entries" : [ { "formId" : "f548684e-31a7-4e63-af5c-4120670f963f", "formSequence" : 1, "fieldId" : "

我有一套像这样的
记录

{
    "recordId" : "5a65d212-774e-4208-8cb4-bf4e92e80898",
    "recordName" : "recordABC",
    "entries" : [
        {
            "formId" : "f548684e-31a7-4e63-af5c-4120670f963f",
            "formSequence" : 1,
            "fieldId" : "element1",
        },
        {
            "formId" : "f548684e-31a7-4e63-af5c-4120670f963f",
            "formSequence" : 2,
            "fieldId" : "element2",
            "value" : "notes"
        },
        {
            "formId" : "f548684e-31a7-4e63-af5c-4120670f963f",
            "formSequence" : 1,
            "fieldId" : "element3",
            "value" : [
                {
                    "originalFileName" : "fileA",
                    "thumbnail" : "thumbnailA"
                },
                {
                    "originalFileName" : "fileB",
                    "thumbnail" : "thumbnailB"
                },
                {
                    "originalFileName" : "fileC",
                    "thumbnail" : "thumbnailC"
                },
                {
                    "originalFileName" : "fileD",
                    "thumbnail" : "thumbnailD"
                }
            ]
        }
    ]
 }
我需要删除该文档

{
    "originalFileName" : "fileC",
    "thumbnail" : "thumbnailC"
}
记录.entries.value
数组

我尝试了下面的查询

db.records.update({ "_id" : "5a65d212-774e-4208-8cb4-bf4e92e80898" , $and : [ { "entries.formSequence" : 1} , { "entries.formId" : "f548684e-31a7-4e63-af5c-4120670f963f"} , { "entries.fieldId" : "element3"}]}, { $pull : { "entries.$.value" : { "originalFileName" : "fileC"}}});
它返回
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
存在一个匹配项,但未删除带有
“originalFileName”:“fileC”
的项


我的问题出了什么问题?如何执行此操作?

在update语句中使用运算符时,需要确保匹配数组中的特定元素。通常不会剪切它,一个数组元素的多个字段需要:

db.records.update(
{ 
“记录ID”:“5a65d212-774e-4208-8cb4-bf4e92e80898”,
“条目”:{
“$elemMatch”:{
“formSequence”:1,
“formId”:“f548684e-31a7-4e63-af5c-4120670f963f”,
“字段ID”:“元素3”
}
}
}, 
{ 
“$pull”:{
“entries.$.value”:{“originalFileName”:“fileB”}
}
}
)
这将确保匹配运算符的“位置”与指定的元素属性的条件的all匹配

本例中的主要问题(也不是必需的,因为您没有在同一字段上请求多个条件,所以它实际上是一个隐式语句,MongoDB就是这样做的)是您没有匹配相同的元素上的条件。所要做的就是确保所有条件实际上都匹配文档中的某个地方,从而匹配任何元素

您也可以这样写,但不会返回正确的结果:

db.records.update(
{ 
“记录ID”:“5a65d212-774e-4208-8cb4-bf4e92e80898”,
“entries.formSequence”:1,
“条目.formId”:“f548684e-31a7-4e63-af5c-4120670f963f”,
“entries.fieldId”:“element3”
}, 
{ 
“$pull”:{
“entries.$.value”:{“originalFileName”:“fileB”}
}
}
)
在语法上完全有效,并且与您编写的内容相同,但是它当然没有为update语句中所需的结果选择正确的元素


因此,正是
$elemMatch
确保所有这些条件都存在于阵列中的同一元素上。这是您想要的,因为它对数组的每个元素执行单独的“查询”,以确保这些条件匹配。

过帐到StackOverflow时,请删除所有制表符。MongoDB shell不喜欢将其剪切和粘贴。谢谢,成功了。非常感谢。但是,我不明白我的查询中的$and运算符有什么问题。@faizi很公平。编辑的更多信息应解释这两种方法之间的区别。