php - mongodb在查找查询中获取_id作为字符串

标签 php mongodb mongodb-query aggregation-framework

这里我创建了一个包含单个文档的集合

db.getCollection('example').insert({"example":1});

我已经尝试使用 Projection,但我找回了 _id。

db.getCollection('example').find({"example":1},{"_id":1});

{
    "_id" : ObjectId("562a6300bbc948a4315f3abc")
}

但是,我需要如下所示的输出。

  1. id 而不是 _id
  2. ObjectId("562a6300bbc948a4315f3abc") 与 "562a6300bbc948a4315f3abc"

    { “id”:“562a6300bbc948a4315f3abc” }

虽然我可以在我的应用程序服务器(基于 PHP)上处理 #1 和 #2 以获得所需的输出,但我正在寻找是否有一种方法可以从 mongo 本身查询时获得预期的结果

最佳答案

MongoDB 4.0 添加了 $convert聚合运算符和 $toString别名,它可以让你做到这一点:

db.getCollection('example').aggregate([
  { "$match": { "example":1 } },
  { "$project": { "_id": { "$toString": "$_id" } } }
])

主要用法很可能是将 _id 值用作文档中的“键”。

db.getCollection('example').insertOne({ "a": 1, "b": 2 })

db.getCollection('example').aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": [
        [{ 
          "k": { "$toString": "$_id" },
          "v": {
            "$arrayToObject": {
              "$filter": {
                "input": { "$objectToArray": "$$ROOT" },
                "cond": { "$ne": ["$$this.k", "_id"] }
              }
            }
          }
        }] 
      ]
    }
  }}
])

哪个会返回:

{ 
  "5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
}

与另一个示例一样,它清楚地显示了字符串。

一般来说,当文档从服务器返回时,通常有一种方法可以对光标进行“转换”。这通常是一件好事,因为 ObjectId 是 12 字节的二进制表示,而不是占用更多空间的 24 字符十六进制“字符串”。

shell 有一个 .map() 方法

db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )

NodeJS 有一个 Cursor.map() 可以做同样的事情:

let cursor = db.collection('example').find()
    .map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));

while ( await cursor.hasNext() ) {
  let doc = cursor.next();
  // do something
})

同样的方法也存在于其他驱动程序中(只是 PHP 除外),或者您可以只迭代光标并转换内容,这更可能是最好的做法。


事实上,当在 shell 中工作时,只需将整个游标结果添加到任何游标返回语句中,就可以非常轻松地将其简化为单个对象

.toArray().reduce((o,e) => { 
  var _id = e._id;
  delete e._id;
  return Object.assign(o, { [_id]: e })
},{ })

或者对于完整的 ES6 JavaScript 支持环境,如 nodejs:

.toArray().reduce((o,({ _id, ...e })) =>  ({ ...o, [_id]: e }),{ })

真正简单的东西,没有需要在聚合框架中处理的复杂性。并且在任何语言中都非常有可能以大致相同的方式。

关于php - mongodb在查找查询中获取_id作为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33307610/

相关文章:

php - 无法通过intl-support安装PHP 5.3.0

php - 使用 Node 的 request-promise 将数据 POST 到 JSON REST API

javascript - Meteor 并用值填充数组

java - 如何解析 WebappClassLoaderBase

node.js - MongoDB 聚合组过去 7 天的平均评级,其中包含空值

mongodb - 获取 MongoDB 中存在的字段的记录数

php - 如何使 "PHPmailer"在函数中工作

javascript - 如何查询某个用户的所有文章?

mongodb - 在 MongoDB 中存储扫描的(pdf、tiff、jpeg)文件。

php - 将字符串分成 3 部分,并保持单词完整