查询子文档数组以在Java Spring Data Mongodb中将其删除

时间:2019-03-03 15:59:30

标签: java arrays spring mongodb

我的收藏集中的文档具有一个嵌入的子文档数组“ tvals”,其中包含一组布尔标志以及一个ObjectIds数组“ elIds”,如下所示。

我很难编写适当的查询来对文档集合执行许多操作。

JSON中的示例 文档一-数组中具有布尔字段“ man” = true的一个或多个子文档

{     “ _id”:ObjectId(“ 5c7975b059d4e2533493a404”),

"dpID" : ObjectId("5c7970d759d4e2533493a3ee"),

"elIds" : [
    ObjectId("5c79709f59d4e253349373c7"), 
    ObjectId("5c79709f59d4e253349373d4"), 
    ObjectId("5c7970ac59d4e25334938e31")
], 

"Acct" : "5c7970a659d4e25334937b67",

"tvals" : [
    {
        "tid" : ObjectId("5c7970a259d4e253349377da"), 
        "val" : 10.0, 
        "calc" : true, 
        "lock" : false, 
        "man" : false, 
        "imp" : false, 
        "agg" : false
    },

    {
        "tid" : ObjectId("5c7970a259d4e253349377db"), 
        "val" : 10.0, 
        "calc" : true, 
        "lock" : false, 
        "man" : true, 
        "imp" : false, 
        "agg" : false
    },

    {
        "tid" : ObjectId("5c7970a259d4e253349377dc"), 
        "val" : 10.0, 
        "calc" : true, 
        "lock" : true, 
        "man" : true, 
        "imp" : false, 
        "agg" : true
    }
], 
"_class" : "tpdata"

}

文档二-子文档具有布尔字段“ imp” = true和“ agg” = false {     “ _id”:ObjectId(“ 5c7975b059d4e2533493a40a”),

"dpID" : ObjectId("5c7970d759d4e2533493a3ee"),

"elIds" : [
    ObjectId("5c79709f59d4e253349373c7"), 
    ObjectId("5c79709f59d4e253349373d4"), 
    ObjectId("5c7970ac59d4e25334938e31")
],

"Acct" : "5c7970a659d4e25334937b67", 

"tvals" : [
    {
        "tid" : ObjectId("5c7970a259d4e253349377da"), 
        "val" : 10.0, 
        "calc" : false, 
        "lock" : false, 
        "man" : false, 
        "imp" : true, 
        "agg" : false
    },

    {
        "tid" : ObjectId("5c7970a259d4e253349377db"), 
        "val" : 10.0, 
       "calc" : false, 
        "lock" : false, 
        "man" : false, 
        "imp" : true, 
        "agg" : false
    },

    {
        "tid" : ObjectId("5c7970a259d4e253349377dc"), 
        "val" : 10.0, 
        "calc" : false, 
        "lock" : false, 
        "man" : false, 
        "imp" : true, 
        "agg" : false
    }
], 
"_class" : "tpdata"

}

文档三-带有布尔字段“ agg” = true的子文档

{     “ _id”:ObjectId(“ 5c75b6545486e48de8520814”),

"dpID" : ObjectId("5c75b4dc5486e48de8520635"),

"elIds" : [
    ObjectId("5c75b4675486e48de851d5c3"), 
    ObjectId("5c75b4675486e48de851d5ce"), 
    ObjectId("5c75b48d5486e48de851f02d")
], 

"Acct" : "5c75b4745486e48de851dd77", 

"tvals" : [
    {
        "tid" : ObjectId("5c75b46e5486e48de851d9af"), 
        "val" : 504.3, 
        "calc" : false, 
        "lock" : false, 
        "man" : false, 
        "imp" : false, 
        "agg" : true
    }, 

    {
        "tid" : ObjectId("5c75b46e5486e48de851d9b0"), 
        "val" : 84.29000000000002, 
        "calc" : false, 
        "lock" : false, 
        "man" : false, 
        "imp" : false, 
        "agg" : true
    }, 

    {
        "tid" : ObjectId("5c75b46e5486e48de851d9b1"), 
        "val" : 41.40999999999997, 
        "calc" : false, 
        "lock" : false, 
        "man" : false, 
        "imp" : false, 
        "agg" : true
    }
], 
"_class" : "tpdata"

}

我想帮助在Java代码中构建这3个查询,以供使用或与MongoTemplate一起应用以执行操作

  1. 在“ tvals”数组中查找并删除集合中所有没有子文档的文档,其中“ lock”标志= true或“ man”标志= true或“ agg”标志为true,并且“给定文档的特定“ dpID” ObjectId值,“ calc”标志为false。

  2. 从“ tvals”数组中具有一个或多个子文档的任何文档中查找和删除“ tvals”数组中的子文档,这些子文档具有“ man”布尔标志= false或“ lock”标志= false并带有给定一组“ dpID” ObjectId值。在这里,我们要保留对“锁”或“人”具有真实值的子文档。我怀疑这将是使用$ pull

  3. 的一次更新
  4. 查找和删除集合中所有在“ tvals”数组中没有子文档的文档,其中{{lock} flag = true或“ man” flag = true}或{“ agg” flag为给定特定的“ dpID” ObjectId值,并给定文档的一组特定的“ elIds”值,则返回true和“ calc”标志为false。 “ elIds”是ObjectIds的数组

我正在寻找带有任何基本解释的查询示例代码(Java和/或Javascript),将不胜感激。

谢谢。

0 个答案:

没有答案