【问题标题】:Matching a value in subdocument array and matching array to _id匹配子文档数组中的值并将数组匹配到_id
【发布时间】:2021-04-08 03:48:37
【问题描述】:

我有一组用户,如下所示:

{
    "_id": {
        "$oid": "5ff6298f2056ad02272d10f2"
    },
    
    "name": "Billy Bob",
    "story": {
        "posts": [
           {"id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"}, 
           {"id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"}, 
           {"id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"}   
        ],
        "whoCanView": [{
            "$oid": "5ff891bd749ed24316272317"
        }, {
            "$oid": "5ffc89392056ad02272d10f3"
        }]
    }
}

我希望将所有用户及其故事列在一个我称之为“联系人”的数组中。当前查询集合的用户只有在其 userId 在“whoCanView”数组中时才能获得结果。

这是我目前所拥有的,但似乎没有用:

users.find({'story' : {
                        '$elementMatch' : {
                            '_id' : {'$in' : contacts},
                            ObjectID(userId) : {'$in' : 'story.whoCanView'}
                        }
                    }
                });

任何指导将不胜感激。谢谢!

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:
    ObjectID(userId) : {'$in' : 'story.whoCanView'}
    

    上述代码以及$elemMatch 运算符的用法在您的代码中是错误的。试试这个查询:

    let contacts = [
        ObjectId("5ff6298f2056ad02272d10f2"), 
        ObjectId("5ff6298f2056ad02272d10f3"),
        ObjectId("5ff6298f2056ad02272d10f4")
    ];
    
    let userId = ObjectId("5ff891bd749ed24316272317");
    
    db.users.find(
        {
            "_id": { $in: contacts },
            "story.whoCanView": userId
        },
        {
            "strories": "$story.posts"
        }
    );
    

    userIdObjectId("5ff891bd749ed24316272317") 时的输出:

    /* 1 createdAt:1/7/2021, 2:50:15 AM*/
    {
        "_id" : ObjectId("5ff6298f2056ad02272d10f2"),
        "strories" : [
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            },
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            },
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            }
        ]
    },
    
    /* 2 createdAt:1/7/2021, 2:50:15 AM*/
    {
        "_id" : ObjectId("5ff6298f2056ad02272d10f3"),
        "strories" : [
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            },
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            },
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            }
        ]
    },
    
    /* 3 createdAt:1/7/2021, 2:50:15 AM*/
    {
        "_id" : ObjectId("5ff6298f2056ad02272d10f4"),
        "strories" : [
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            },
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            },
            {
                "id" : "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45"
            }
        ]
    }
    

    userIdObjectId("5ff891bd749ed24316272318") 时的输出:

    []
    

    users 集合中的测试数据:

    [
        {
            "_id": ObjectId("5ff6298f2056ad02272d10f2"),
            "name": "Billy Bob",
            "story": {
                "posts": [
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" },
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" },
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" }
                ],
                "whoCanView": [
                    ObjectId("5ff891bd749ed24316272317"),
                    ObjectId("5ffc89392056ad02272d10f3")
                ]
            }
        },
        {
            "_id": ObjectId("5ff6298f2056ad02272d10f3"),
            "name": "Billy Bob",
            "story": {
                "posts": [
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" },
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" },
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" }
                ],
                "whoCanView": [
                    ObjectId("5ff891bd749ed24316272317"),
                    ObjectId("5ffc89392056ad02272d10f3")
                ]
            }
        },
        {
            "_id": ObjectId("5ff6298f2056ad02272d10f4"),
            "name": "Billy Bob",
            "story": {
                "posts": [
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" },
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" },
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" }
                ],            
                "whoCanView": [
                    ObjectId("5ff891bd749ed24316272317"),
                    ObjectId("5ffc89392056ad02272d10f3")
                ]
            }
        },
        {
            "_id": ObjectId("5ff6298f2056ad02272d10f5"),
            "name": "Billy Bob",
            "story": {
                "posts": [
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" },
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" },
                    { "id": "b4a12557-4dfa-47eb-9f27-7bbcad0f4c45" }
                ],            
                "whoCanView": [
                    ObjectId("5ff891bd749ed24316272317"),
                    ObjectId("5ffc89392056ad02272d10f3")
                ]
            }
        }
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2019-09-03
      • 2019-01-16
      • 2016-10-02
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多