如何在 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
}]
})
我正在搜索 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
}]
})