通过slug查询的Mongoose对象数组

时间:2017-03-27 15:30:00

标签: node.js mongodb mongoose

我正在尝试查询具有此类对象数组的文档。它是添加标签的历史。

{
    "added_by" : ObjectId("58d92d8b11af264b87a8f5d4"),
    "tag" : ObjectId("58d92d8b11af264b87a8f5ed"),
    "_id" : ObjectId("58d92d8c11af264b87a8f6d5"),
    "added_at" : ISODate("2017-03-02T22:06:42.788Z")
}

我无法仅对_id

进行查询

我试过这个:

var query = {
    'tags.tag': {
        slug: $in: ['tag-name']
    }
}
Node.find(query, (err, nodes) => {
    if (err) {
        res.status(404)
        res.send(err)
    } else {
        res.json(nodes);
    }
}).populate(['tags.tag'])

以下是文件:

{
    "_id" : ObjectId("58d92d8c11af264b87a8f6d0"),
    "user_id" : ObjectId("58d92d8b11af264b87a8f5d4"),
    "uid" : "-KeG2FvL0jwkHFvOautH",
    "updated_at" : ISODate("2017-03-02T22:06:42.788Z"),
    "created_at" : ISODate("2017-03-02T22:06:42.051Z"),
    "tags" : [ 
        {
            "added_by" : ObjectId("58d92d8b11af264b87a8f5d4"),
            "tag" : ObjectId("58d92d8b11af264b87a8f5ed"),
            "_id" : ObjectId("58d92d8c11af264b87a8f6d5"),
            "added_at" : ISODate("2017-03-02T22:06:42.788Z")
        }, 
        {
            "added_by" : ObjectId("58d92d8b11af264b87a8f5d4"),
            "tag" : ObjectId("58d92d8b11af264b87a8f626"),
            "_id" : ObjectId("58d92d8c11af264b87a8f6d4"),
            "added_at" : ISODate("2017-03-02T22:06:42.788Z")
        }
    ],
    "status" : "publish",
    "description" : "some text here",
    "title" : "Anna James",
    "__v" : 0
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于您存储了对标记的引用,因此您需要先通过slug获取标记:

TagsCollection.find({slug:'tag-name'}, (err, tags)...)

然后按tag._id过滤:

var query = {
    'tags.tag': new ObjectId(tag._id)
}

var query = {
    'tags.tag': {'$in": [new ObjectId(tag._id), ....]}
}

如果你有超过1个标签与slug匹配。

老实说,如果您将标签直接存储在文档中,而不是存储引用,那么效率会更高。