使用$或的mongodb mongoose简单嵌套查询

时间:2017-01-30 10:19:02

标签: node.js mongodb mongoose

基本上我正在开发一个聊天应用程序,这个mongoose架构代表了一个用于2个用户之间私人聊天的Schema。

我想要做的是检查客户端是否提供了id1和id2 在我的私人聊天db的集合。问题是这个mongoDB查询无法正常工作,如果这些用户ID已存在于聊天文档中。在user1和user2中使用相同的_id创建一个新的聊天文档。这就是为什么我需要$or运算符,但我的查询不能正常工作

const chatSchema = new Schema({

        user1: {

            _id: String,
            username: String,
            fullName: String
        },
        user2: {

            _id: String,
            username: String,
            fullName: String
        },
        messages: [
            {
                _id: false,
                author: String,
                text: String,
                date: Number
            }
        ]

    });

所以这是我的实现来检查2个用户之间的这种关系是否已经存在。如果存在则执行某些操作,如果它不创建文档并保存它。 data.user._id表示用户的ID,data.friend._id表示您要与之聊天的用户的ID。

Chat.count(
        {
            $or: [
                {
                    user1: {
                        _id: data.user._id
                    },
                    user2: {
                        _id: data.friend._id
                    }
                },
                {
                    user2: {
                        _id: data.user._id
                    },
                    user1: {
                        _id: data.friend._id
                    }
                }
            ]
        }, (err, count) => {
            if (!count) {
                new Chat({
                    user1: data.user,
                    user2: data.friend,
                    messages: []
                }).save((err, data) => {
                    if (err) {
                        console.log(err);
                    }
                    socket.join(data._id);
                    socket.emit('chats', data);
                });
            }
        });

1 个答案:

答案 0 :(得分:2)

您需要使用MongoDB dot notation在$或运算符中进行查询。

在$或

中尝试此操作
    {
        $or: [
            {
                "user1._id": data.user._id,                    
                "user2._id": data.friend._id                    
            },
            {
                "user2._id": data.user._id,                     
                "user1._id": data.friend._id     
            }
        ]
    }

根据文档: -

  

要使用点表示法指定或访问嵌入文档的字段,请将嵌入的文档名称与点(。)和字段名称连接起来,并用引号括起来: