如何在 mongodb 的 $or 语句中组合两个 $and 语句?

How do I combine two $and statements in an $or statement in mongodb?

我正在搜索 mongodb 从人 A 到人 B 的所有消息以及从人 B 到人 A 的所有陈述。这样我就可以进行对话

从:人 A AND 到:人 B

从:人 B AND 到人 A

// Create a conversation
db.collection('messages', function (err, collection) {
    collection.find(
        { // how do I turn this $and into a two nested $and statements inside $or?
            $and: [{
                receiver: new BSON.ObjectID(req.user._id)
            }, {
                sender: new BSON.ObjectID(req.body.sender)
            }]
        }
    ).sort({
        date: -1
    }).toArray(function (err, docs) {
        console.log(docs);
    })
});

答案应该是这样的:

db.collection('messages', function (err, collection) {
    collection.find(
        { 
        $or : [         
            {$and: [{
                receiver: new BSON.ObjectID(req.user._id)
            }, {
                sender: new BSON.ObjectID(req.body.sender)
            }]},
            {$and: [{
                receiver: new BSON.ObjectID(req.body.sender)
            }, {
                sender: new BSON.ObjectID(req.user._id)
            }]},
        ]
        }
    ).sort({
        date: -1
    }).toArray(function (err, docs) {
        console.log(docs);
    })
});

试试这个

db.collection('messages', function (err, collection) {
    collection.find(
        {  $or: [
                    {$and: [{ receiver: new BSON.ObjectID(req.user._id)}, {sender: new BSON.ObjectID(req.body.sender)}]}
                    {$and: [{ receiver: new BSON.ObjectID(req.body.sender)}, {sender: new BSON.ObjectID(req.user._id)}]}
        ]
}).sort({
        date: -1
    }).toArray(function (err, docs) {
        console.log(docs);
    }) });

我不熟悉你调用的 collection 函数,也不知道你指的 req 对象是什么,所以对我的回答持保留态度.

在我看来,您使这件事变得比实际需要的复杂得多。您的 $and 语句非常简单,不需要 $and 关键字:

collection.find({
    receiver: req.user._id,
    sender:   req.body.sender
})

现在,$and$or 的工作方式完全相同:它们采用对象数组。因此,让我们写下我假设您想要查询的内容:

collection.find({
    $or: [{
        receiver: req.user._id,
        sender:   req.body.sender
    }, {
        receiver: req.body.sender,
        sender:   req.user_id
    }]
})