首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB $addToSet有一些逻辑

MongoDB $addToSet有一些逻辑
EN

Stack Overflow用户
提问于 2019-11-20 17:23:17
回答 1查看 95关注 0票数 0

最终目标是在每个partners对象都不存在的情况下向pathway列表中添加一个新的合作伙伴。如果pathway_name不等于Engagement Team

例如,我想添加以下合作伙伴:

代码语言:javascript
复制
{
                    "_id" : ObjectId("5dd5762be13e15a73f042ce5"), 
                    "partner" : ObjectId("5dd57633bf0cbbbb36bc112f")
}
代码语言:javascript
复制
 "pathways" : [
        {
            "_id" : ObjectId("5d837689b57cc711487f1cf0"), 
            "pathway_name" : "Electronics Technology with Advanced Manufacturing Mechatronics", 
            "partners" : [
                {
                    "_id" : ObjectId("5d837ab8b57cc711487f1d28"), 
                    "partner" : ObjectId("5d837426b57cc711487f1c96")
                }
            ]
        }, 
        {
            "_id" : ObjectId("5d837694b57cc711487f1cf1"), 
            "pathway_name" : "Pre-Mechanical Engineering", 
            "partners" : [
                {
                    "_id" : ObjectId("5d837acfb57cc711487f1d29"), 
                    "partner" : ObjectId("5d837421b57cc711487f1c92")
                }
            ]
        }, 
        {
            "_id" : ObjectId("5da6055da0eb361cc8da26dc"), 
            "pathway_name" : "Engagement Team", 
            "partners" : [
                {
                    "_id" : ObjectId("5da60711a0eb361cc8da26f0"), 
                    "partner" : ObjectId("5d83749fb57cc711487f1cc2")
                }
            ]
        }
    ], 

我当前的查询如下,我不知道如何添加只添加合作伙伴的逻辑,如果它们不基于partner字段本身,而不是基于合作伙伴对象的_id字段。

db.getCollection("schools").updateMany({}, $addToSet:{"pathways$[].partners"})

预期结果:

代码语言:javascript
复制
 "pathways" : [
        {
            "_id" : ObjectId("5d837689b57cc711487f1cf0"), 
            "pathway_name" : "Electronics Technology with Advanced Manufacturing Mechatronics", 
            "partners" : [
                {
                    "_id" : ObjectId("5d837ab8b57cc711487f1d28"), 
                    "partner" : ObjectId("5d837426b57cc711487f1c96")
                },
                {
                    "_id" : ObjectId("5dd5762be13e15a73f042ce5"), 
                    "partner" : ObjectId("5dd57633bf0cbbbb36bc112f")
                }
            ]
        }, 
        {
            "_id" : ObjectId("5d837694b57cc711487f1cf1"), 
            "pathway_name" : "Pre-Mechanical Engineering", 
            "partners" : [
                {
                    "_id" : ObjectId("5d837acfb57cc711487f1d29"), 
                    "partner" : ObjectId("5d837421b57cc711487f1c92")
                },
                {
                    "_id" : ObjectId("5dd5762be13e15a73f042ce5"), 
                    "partner" : ObjectId("5dd57633bf0cbbbb36bc112f")
                }
            ]
        }, 
        {
            "_id" : ObjectId("5da6055da0eb361cc8da26dc"), 
            "pathway_name" : "Engagement Team", 
            "partners" : [
                {
                    "_id" : ObjectId("5da60711a0eb361cc8da26f0"), 
                    "partner" : ObjectId("5d83749fb57cc711487f1cc2")
                }
            ]
        }
    ], 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-20 22:39:33

请试一试,让我知道:

代码语言:javascript
复制
db.getCollection("schools").update(
    {},
    {
        $push: {
            'pathways.$[eachPathway].partners': {
                "_id": ObjectId("5dd5762be13e15a73f042ce5"),
                "partner": ObjectId("5dd57633bf0cbbbb36bc112f")
            }
        }
    },
    { arrayFilters: [{ $and: [{ "eachPathway.pathway_name": { $ne: "Engagement Team" } },
    {"eachPathway.partners._id":{$ne: ObjectId("5dd5762be13e15a73f042ce5")}}]}], multi: true }
)

注意:似乎不能对整个对象进行比较,所以我们需要至少比较输入对象中的一个字段和数组中的对象中的相同字段。最后,我们可以使用$push,因为重复的对象已经被过滤掉了,但是如果您需要整个对象比较的话,我们不确定如何实现它--我认为可能不需要它。

可能会看到此错误或没有更新文档:

路径'pathways.$eachPathway.partners‘中找不到标识符'eachPathway’的数组过滤器

简而言之,这是因为robo3T或其他正在使用的mongoDB客户端无法处理arrayFilters,所以要测试这个查询,请直接使用代码测试它。

参考文献: No array filter issue

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58960062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档