mongoose findOneAndUpdate返回匹配的子文档

时间:2016-01-04 11:34:16

标签: node.js mongodb mongoose

我必须修改架构中的一个子文档。在这个子文档中,我存储了一个用于保持与其他文档的关系的键。仅当第一个文档被修改时,才会修改第二个文档。我尝试使用findOneAndUpdate执行此操作。

User.findOneAndUpdate({
            _id: ReceivingId,
            "friendship": {
                "$elemMatch": {
                    "_id": FriendshipId
                    , "verse": 1
                    , "status": "pending"
                }
            }
        }, {
            "$set": {
                "friendship.$.status": "accepted",
                "friendship.$.began": util.moment().toDate()
            },
            "$unset": {"friendship.$.verse": ""}
        }, {"new": true})
        .select('friendship.$')
        .exec()
        .then(function Query(upReceiving) {

            if (!upReceiving)
                throw new Error({status: 304, message: "No friendship update"});

            var ApplicantId = upReceiving.friendship.friend;
            console.log("Sender ID", upReceiving);

            return User.findOneAndUpdate({          //Query
                _id: ApplicantId,
                "friendship": {
                    "$elemMatch": {
                        "friend": ReceivingId,
                        "status": "pending"
                    }
                }

            }, {                            //Update
                "$set": {
                    "friendship.$.status": "accepted",
                    "friendship.$.began": util.moment().toDate()
                }

            }, {"select": "friendship.$", "new": true}).exec();

        })
        .then(function Query(upApplicant) {

            if (!upApplicant)
                return res.status(304).json({message: "No friendship update"});

            res.json({message: "Friendship accepted", friendship: {sender: upApplicant._id, receiver: ReceivingId}});

        }, function Error(err) {

            var status = 500;

            if (undefined !== err.status)
                status = err.status;

            console.log(err);
            res.status(status).json(err);
        });

第一次更新工作,但带有$运算符的select语句不返回从查询中找到的子文档。 怎么了?

1 个答案:

答案 0 :(得分:0)

我正在读你的代码,我对它有疑问,

该字段" upReceiving.friendship。朋友"包含有效的ObjectId?

我问这个是因为我看到了这句话:

var ApplicantId = upReceiving.friendship.friend;

然后,您尝试使用ObjectId

等字段查找文档
User.findOneAndUpdate(
            _id: ApplicantId,..