Node.js 按id查找子文档

Node.js 按id查找子文档,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,他在Mongodatabase中存储客户订单。每个订单中都有一个或多个用户创建的“草稿”,这些草稿是具有自己ID的子文档。其目的是使它们可以单独使用,而不以任何方式涉及订单本身。但我不知道如何按id搜索单个子文档 我的模型如下所示: var mongoose = require('mongoose'); var orderDraftSchema = mongoose.Schema({ name: String, color: String, price: Number,

他在Mongodatabase中存储客户订单。每个订单中都有一个或多个用户创建的“草稿”,这些草稿是具有自己ID的子文档。其目的是使它们可以单独使用,而不以任何方式涉及订单本身。但我不知道如何按id搜索单个子文档

我的模型如下所示:

var mongoose = require('mongoose');

var orderDraftSchema = mongoose.Schema({
    name: String,
    color: String,
    price: Number,
    attributes: []
});

var orderSchema = mongoose.Schema({
    date: Date,
    value: Number,
    status: String,
    customer: {},
    drafts: [orderDraftSchema]
})

module.exports = mongoose.model('Orders', orderSchema);
var Order = require("../models/order.js");

getDraft: function(draftId, cb) {
    Order.find({
        drafts: {
            $elemMatch: {
                _id: {
                    $in: draftId
                }
            }
        }
    }, function(err, results) {
        if (err) {
            cb('No Matching Order found!');
        } else {
            var drafts = results[0].drafts;
            var resultDraft;
            for (i in drafts) {
                if (drafts[i]._id == draftId) {
                    resultDraft = drafts[i];
                }
            }

            console.log(resultDraft);
            cb(resultDraft);
        }
    });
}
我的搜索结果应该是什么样子?我也需要导出子模式吗?我是在搜索我的子模式还是父模式

这让人感觉非常笨拙,表现不佳,希望有一个更优雅的解决方案:

var mongoose = require('mongoose');

var orderDraftSchema = mongoose.Schema({
    name: String,
    color: String,
    price: Number,
    attributes: []
});

var orderSchema = mongoose.Schema({
    date: Date,
    value: Number,
    status: String,
    customer: {},
    drafts: [orderDraftSchema]
})

module.exports = mongoose.model('Orders', orderSchema);
var Order = require("../models/order.js");

getDraft: function(draftId, cb) {
    Order.find({
        drafts: {
            $elemMatch: {
                _id: {
                    $in: draftId
                }
            }
        }
    }, function(err, results) {
        if (err) {
            cb('No Matching Order found!');
        } else {
            var drafts = results[0].drafts;
            var resultDraft;
            for (i in drafts) {
                if (drafts[i]._id == draftId) {
                    resultDraft = drafts[i];
                }
            }

            console.log(resultDraft);
            cb(resultDraft);
        }
    });
}

尝试
Order.find({drafts:{$elemMatch:{{u id:{$in:draftId}}})
假设draftId是一个ArrayTanks!现在我得到了一个结果,这很好。但是现在返回了整个订单。我只想得到单个草稿,而不是整个订单。现在按id过滤返回的元素以获得所需的草稿是有效的还是有更优雅的方法来解决这个问题?在回调中,您可以从中获得所需的订单若要自己从草稿数组中提取草稿,我很吃惊。您可以使用lodash或simple for loop来查找草稿。或者看看这里如何使用聚合框架来提取一份草稿,但我不太了解这一点,所以无法帮助您如果需要经常查询草稿,最好将它们保存到单独的集合中nd使用
drafts:[{type:mongoose.Types.ObjectId,ref:'}]
谢谢,现在迭代并返回了特定的草稿。这很有效,但感觉不是很优雅。你最后的方法是什么?你有文档链接吗?谢谢