以Collection 为例:

{
    "event_type" : "ENTRY",
    "DateTime" : ISODate("2024-02-08T00:00:00.000+0000"),
},
{
    "event_type" : "ENTRY",
    "DateTime" : ISODate("2024-02-09T00:00:00.000+0000"),
},
{
    "event_type" : "ENTRY",
    "DateTime" : ISODate("2024-02-10T00:00:00.000+0000"),
},
{
    "event_type" : "DELETE",
    "DateTime" : ISODate("2024-02-10T00:00:00.000+0000"),
},
{
    "event_type" : "DELETE",
    "DateTime" : ISODate("2024-02-24T00:00:00.000+0000"),
}

我想要做的是查找与任何删除中的日期匹配的所有条目

我的shell脚本:

var col = db.getCollection("test_collection");

var delete_dates = col.find({"event_type" : "DELETE" }).map(function(x) {return  x.DateTime});
col.find({"event_type" : "ENTRY", "DateTime" : {$in : delete_dates}});

不出所料,我可以看到数组DELETE_DATES有两个值,并且它们都是"ISODate"类型.但是,最后一行不返回任何内容.

如果我用{$in : [ ISODate("2024-02-10T00:00:00.000+0000"), ISODate("2024-02-24T00:00:00.000+0000")]}替换{$in : delete_dates},它会像预期的那样工作,并且我会得到一个结果.

那么我搞砸了什么呢?如何在匹配的$in部分中使用该数组?

推荐答案

一种 Select 是在单个(原子)聚合查询中执行此操作:

  1. $group除以DateTime,并保留原始的ENTRY事件和删除事件的_id
  2. 只保留两者都有的文件.
  3. 格式
db.collection.aggregate([
  {$group: {
      _id: "$DateTime",
      entry: {$push: {$cond: [{$eq: ["$event_type", "ENTRY"]}, "$$ROOT", "$$REMOVE"]}},
      delete: {$push: {$cond: [{$eq: ["$event_type", "DELETE"]},  "$_id", "$$REMOVE"]}}
  }},
  {$match: {"delete.0": {$exists: true}, "entry.0": {$exists: true}}},
  {$replaceRoot: {newRoot: {$first: "$entry"}}}
])

看看它在mongoDB playground号公路上是如何工作的

Mongodb相关问答推荐

使用查询参数过滤MongoDB Go驱动程序时出现问题

Mongo聚合项目数组交集

数组字段包含其他字段的数组值

MongoDB对两个串联数组进行排序

当日期和时间在不同键的字符串中时,Mongo 查询过滤今天的数据

如何在 kubernetes 中获取分片 mongodb 的备份

MongoDB:嵌套数组计数+原始文档

有没有办法从另一条记录中插入一条记录

MongoDB 列表 - 获取每第 N 个元素

更新 MongoDB 中嵌套实体数组中的属性

.insertOne 不是函数

升级mongodb

MongoDB:自动生成的 ID 为零

MongoDB 查找精确的数组匹配,但顺序无关紧要

直接从 URL 查询字符串提供的 mongo 查询有多危险?

Mongodb:为什么 show dbs 不显示我的数据库?

没有数组的嵌入文档?

如何使用 Pymongo 在 MongoDB 中 Select 单个字段?

MongoDb:聚合 $lookup 过滤外部文档

对象不是 JSON 可序列化的