【问题标题】:Mongoose id function returning nullMongoose id 函数返回 null
【发布时间】:2015-05-16 01:52:48
【问题描述】:

我正在尝试从 MongoDB 获取子文档。我可以得到父文档,它看起来像:

    {
        "_id" : ObjectId("5550a7948be994430f7df1b4"),
        "address" : "Grafton St, Dublin 2",
        "coords" : [
            -6.2597468,
            53.3422998
        ],
        "facilities" : [
            "food",
            "irish history"
        ],
        "name" : "Laura Dunphy",
        "openingTimes" : [
            {
                "days" : "Monday - Friday",
                "times" : [
                    "10am",
                    "12pm",
                    "2pm"
                ]
            },
            {
                "days" : "Saturday",
                "times" : [
                    "8am",
                    "10am",
                    "12pm"
                ]
            }
        ],
        "rating" : 3,
        "reviews" : [
            {
                "author" : "Simon Holmes",
                "id" : ObjectId("5550c26e8c334adebc7c5dc3"),
                "rating" : 5,
                "timestamp" : ISODate("2013-07-15T23:00:00Z"),
                "reviewText" : "Great guide, it was fun."
            }
        ]
    }

当我这样做时:

console.log('guide.reviews is ');
console.log(guide.reviews);

我明白了:

guide.reviews is 
 [{ id: 5550c26e8c334adebc7c5dc3,
  rating: 5,
  timestamp: Tue Jul 16 2013 00:00:00 GMT+0100 (IST),
  reviewText: 'Great guide, it was fun.',
  createdOn: Fri May 15 2015 18:20:57 GMT+0100 (IST),
  author: 'Simon Holmes' }]

这很好。但是当我尝试使用 Mongoose id 函数获取评论时,我总是返回 null:

review = guide.reviews.id('5550c26e8c334adebc7c5dc3');

console.log('review is ');
console.log(review);

结果:

review is
null

知道我做错了什么吗?

【问题讨论】:

  • 我从未使用过这种方法,但是,文档说它会搜索匹配的 "_id",我在您的子文档中看到的只是id跨度>
  • @KevinB 你是对的,子文档是用 id 而不是 _id 保存的。当我更改为 _id 时,它可以工作

标签: node.js mongodb mongoose


【解决方案1】:

MongooseDocumentArray.id(id) 方法在文档数组中搜索_id 属性,但您的子文档没有_id 属性,而是有id。您要么必须将其更改为 _id,要么使用普通的旧 .filter() 或类似的解决方法。

【讨论】:

  • 这也适用于猫鼬模块中的 parent.subdocument.id(id) 方法!
【解决方案2】:

我可能错了,但我以前从未在 Mongoose 中看到过这种 API。

document.id 存在,但它是一个返回 _id 字段的字符串化版本的函数。

在您的情况下,您可以通过循环遍历列表并选择您想要的。

var review = false
for (var i = 0; i < guide.reviews.length; i++) {
    var el = guide.reviews[i]
    if(review._id == '5550c26e8c334adebc7c5dc3') {
        review = el
    }
}

如果你使用lodash,你也可以使用indexBy方法将数组转换为一个哈希,其中所有的项目都由指定的字段来标识:

var _ = require('lodash')
var reviews = _.indexBy(guide.reviews, '_id')
// Then you can do reviews['5550c26e8c334adebc7c5dc3']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 2016-06-24
    • 2019-03-08
    • 1970-01-01
    • 2014-11-02
    • 2017-10-10
    • 2019-05-08
    • 2013-11-23
    相关资源
    最近更新 更多