Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB If条件作为gt中的第二个字段_Mongodb_Mongoose - Fatal编程技术网

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"
                      ]
                    }
                  ]
                }
              ]
            }
          }
        }
      }
    }
  }
])