【问题标题】:MongoDb - How to create a valid JSON/Javascriipt object with ObjectId("") as value?MongoDb - 如何以 ObjectId("") 作为值创建有效的 JSON/Javascript 对象?
【发布时间】:2020-12-10 17:14:58
【问题描述】:

以下是有效的 MongoDb 查询:

  db.persons.aggregate([{
    "$match": {
        "$or": [{
            "$expr": {
                "$eq": ["$_id", ObjectId("5f3258cfbaaccedaa5dd2c96")]
            }
        }]
    }

}])

但是这里的问题是我无法创建一个有效的 JavaScript 对象,如下所示:

 [{
    "$match": {
        "$or": [{
            "$expr": {
                "$eq": ["$_id",  ObjectId("5f3258cfbaaccedaa5dd2c96") ]
            }
        }]
    }
}
}] 

因为ObjectId("5f3258cfbaaccedaa5dd2c96" 既不是字符串也不是数字。 我需要一个有效的 javascript 对象,因为我想将它存储在某处并即时获取并执行,我该怎么做?

编辑: 我在节点中尝试了以下内容:

 var   mquery=[
            {
              "$match": {
                "$or": [
                  {
                    "$expr": {
                      "$eq": [
                        "$_id",
                        {
                          "$oid": "5f3258cfbaaccedaa5dd2c96"
                        }
                      ]
                    }
                  }
                ]
              }
            }
          ];
          const result = await this.db.collection("persons").aggregate(mquery).toArray();

并得到: MongoError: Unrecognized expression '$oid'

【问题讨论】:

  • 你不能在你的情况下只存储对象 ID (5f3258cfbaaccedaa5dd2c96),然后动态生成其余的查询吗?
  • ObjectId("5f3258cfbaaccedaa5dd2c96") 是否有某种 toString 方法
  • 首先,特定查询可能很简单: db.persons.find({_id: ObjectId('5f3258cfbaaccedaa5dd2c96')}) 。其次,您需要将其存储为 JSON 吗?因为您可以使用 BSON 序列化查询对象;或者您需要指定自己的 JSON 编码器来序列化 ObjectId('123') -> { $oid: '123' }
  • 我正在编写一个简单的查询生成器。 mongo db 查询是动态生成的。问题是如何务实地创建查询?我的意思是我可以毫无问题地写{ "$eq": ["$phone", "342355" ] },但我不能写{ "$eq": ["$_id", ObjectId("5f3258cfbaaccedaa5dd2c96") ] }
  • 查询本来可以使用 find() ,但这是我实际需要的简单版本。所以我确实需要聚合

标签: javascript json mongodb mongodb-query aggregation-framework


【解决方案1】:

使用js-bson。 ObjectId 类型为defined here。试试:

const BSON = require('bson');

let oid = new BSON.ObjectId("cafecafecafecafecafecafe")

然后使用 $eq 运算符代替 $expr 和 $eq。

【讨论】:

    【解决方案2】:

    可以使用$toObjectId,将字符串id转换为对象id,

    db.persons.aggregate([
      {
        "$match": {
          "$or": [
            { "$expr": { "$eq": ["$_id", { "$toObjectId": "5f3258cfbaaccedaa5dd2c96" }] } }
          ]
        }
      }
    ])
    

    Playground

    【讨论】:

    • 能否请您修改这个:db.persons.aggregate([{ "$match": { "$or": [{ "$expr": { "$eq": ["$_id", ObjectId("5f3258cfbaaccedaa5dd2c96")] } }] } }]) 使其工作?
    • "$eq": [ {"$oid":"5d505646cf6d4fe581014ab2"}] 这行不通
    • 奇怪,当我在 shell 中执行时,我得到了` unrecognized $oid .`。我还没有尝试使用节点
    • 与节点相同.. 让我添加我自己做的问题。
    • 更新了答案,我不知道为什么它不起作用,但 $oid 是对象 id 的类型,可能是我们不能直接使用类型的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    相关资源
    最近更新 更多