从嵌套数组中删除一个对象的mongoose方法

4

我正在尝试使用mongoose更新文档,通过从嵌套数组中删除对象。我的目标文档如下:

user = {
    "userId" : "myId",
    "connections":
    [{
        "dateConnectedUnix": 1334567891,
        "isActive": true,
        "sessions": [
            {"device": "mobile", "country": "US"},
            {"device": "desktop", "country": "US"}
        ]
    }, {
        "dateConnectedUnix": 1334567893,
        "isActive": false,
        "sessions": [
            {"device": "mobile", "country": "CA"},
            {"device": "desktop", "country": "CA"}
        ]
    }]
}

这是我的尝试,但它没有更新文档:

Users.findOneAndUpdate({ "userId": "myId", "connections.dateConnectedUnix": 1334567891 },
    { $pull: { sessions: { device: "mobile" } } }, (err) => {
        if (err) {
            return res.status(404).json({ message: 'Error' });
        }
        return res.status(200).json({
            success: true,
            message: 'success'
        });
    }
);

生成的文档应该如下所示:
user = {
    "userId" : "myId",
    "connections":
    [{
        "dateConnectedUnix": 1334567891,
        "isActive": true,
        "sessions": [
            {"device": "desktop", "country": "US"}
        ]
    }, {
        "dateConnectedUnix": 1334567893,
        "isActive": false,
        "sessions": [
            {"device": "mobile", "country": "CA"},
            {"device": "desktop", "country": "CA"}
        ]
    }]
}

基本上,它是通过ID查找用户,然后按日期查找连接,并在移动设备上删除设备。在我特定的情况下,结果总是一个匹配的文档、一个匹配的连接和一个匹配的会话。

3个回答

7
因为你的sessions数组在connections内部。请尝试使用“connections.$.sessions”而非只使用sessions, 这样你的查询语句会是:
Users.findOneAndUpdate({ "userId": "myId", "connections.dateConnectedUnix": 1334567891 },
    { $pull: { "connections.$.sessions" : { device: "mobile" } } }, (err) => {
        if (err) {
            return res.status(404).json({ message: 'Error' });
        }
        return res.status(200).json({
            success: true,
            message: 'success'
        });
    }
);

0

您的回答可以通过添加更多支持信息来改进。请编辑以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心中找到有关编写良好答案的更多信息。 - moken

-2
Users.findOneAndUpdate({ _id: "myId" }, { $pull: { connections.sessions: { device: "mobile" } } }, { new: true });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接