MongoDB If条件作为gt中的第二个字段
如果MongoDB If条件作为gt中的第二个字段,mongodb,mongoose,Mongodb,Mongoose,如果$user\u a\u id==socket,我想选择$user\u a\u seen\u at字段,否则选择$user\u b\u seen\u at字段。但我的查询不起作用 $gt:[“$$this.created_at”,如果条件是选择字段] $project: { unread_messages: { $size: { $filter: { input: "$messages",
$user\u a\u id==socket,我想选择$user\u a\u seen\u at
字段,否则选择$user\u b\u seen\u at
字段。但我的查询不起作用
$gt:[“$$this.created_at”,如果条件是选择字段]
$project: {
unread_messages: {
$size: {
$filter: {
input: "$messages",
cond: {
$and: [
{ $eq: ["$$this.to_id", socket.user_id] },
{
$gt: [
"$$this.created_at", {
if: { $eq: ["$user_a_id", socket.user_id] },
then: "$user_a_seen_at",
else: "$user_b_seen_at"
}
]
}
]
}
}
}
}
}
样本数据
{
"_id" : ObjectId("5e4c57649fad2e2cac9f8cd5"),
"user_a_id" : 1,
"user_b_id" : 2,
"user_a_seen_at" : ISODate("2020-02-18T21:30:12.418Z"),
"user_b_seen_at" : ISODate("2020-02-18T15:30:12.418Z"),
"messages" : [
{
"text" : "Hello",
"_id" : ObjectId("5e4c57649fad2e2cac9f8cd4"),
"from_id" : 1,
"to_id" : 2,
"created_at" : ISODate("2020-02-18T21:30:12.409Z")
}
],
"created_at" : ISODate("2020-02-18T21:30:12.418Z"),
"last_activity" : ISODate("2020-02-18T21:30:12.418Z"),
"__v" : 0
}
您需要使用运算符对布尔表达式求值,以返回两个指定返回表达式之一
{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case> } }
//or simplified
{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }
请提供样本文档和输入values@whoami,我添加了一些示例数据。
db.collection.aggregate([
{
$project: {
unread_messages: {
$size: {
$filter: {
input: "$messages",
cond: {
$and: [
{
$eq: [
"$$this.to_id",
socket.user_id
]
},
{
$gt: [
"$$this.created_at",
{
$cond: [
{
$eq: [
"$user_a_id",
socket.user_id
]
},
"$user_a_seen_at",
"$user_b_seen_at"
]
}
]
}
]
}
}
}
}
}
}
])