在Node.JS中使用MongoDB,想要通过_id获取参考集合的对象

3

我希望通过引用ID集合获取特定记录的所有详细信息。

{
"_id" : ObjectId("586c8bf63ef8480af89e94ca"),
"createdDate" : ISODate("2017-01-04T05:45:26.945Z"),
"branch" : {
    "$ref" : "branchmst",
    "$id" : "5864ac80fa769f09a4881791",
    "$db" : "eviral"
    },
"__v" : 0
}

这是我的收藏记录。我需要从“branchmst”集合中获取所有详细信息,其中“_id”为“5864ac80fa769f09a4881791”。
2个回答

4

您的收藏是使用手动引用的示例,即在另一个文档中包含一个文档的 _id 字段 DBref。然后,Mongoose 可以发出第二个查询以根据需要解析引用字段。

第二个查询将使用聚合方法,该方法具有 $lookup 运算符,该运算符将执行左外连接到同一数据库中的 "branchmst" 集合,以便筛选出要处理的 "joined" 集合中的文档:

MyModel.aggregate([
    { "$match": { "branch": "5864ac80fa769f09a4881791" } },
    {
        "$lookup": {
            "from": "branchmst",
            "localField": "branch",
            "foreignField": "_id",
            "as": "branchmst"
        }
    },
    { "$unwind": "$branchmst" }
])

你可以在Mongoose中使用populate()函数,前提是你已经在模型定义中显式地定义了refs。
var mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;

// define the main schema
var mySchema = mongoose.Schema({
    createdDate: { type: Date, default: Date.now },
    branch: { type: ObjectId, ref: 'Branch' }  
})

// define the branch schema
var branchSchema = mongoose.Schema({
    name: String,
    address: String  
})

// compile the models
var MyModel = mongoose.model('MyModel', mySchema),
    Branch = mongoose.model('Branch', branchSchema);

// populate query
MyModel.find({ "branch": "5864ac80fa769f09a4881791" })
       .populate('branch')
       .exec(function (err, docs) {
           //console.log(docs[0].branch.name);
           console.log(docs);
       });

1
只要您将分支 $id 保存为 Schema 对象类型即可。
 yourRecord.find({}).populate(branch.$id).exec(function(err, data){
  console.log(data)
})

"provideid"是什么? - Hardik Mandankaa
这是传递ID的变量名称,如果您想查找特定文档,请使用此ID;否则,可以直接进行操作:providedid。它将填充所有记录。 - sac Dahal
var objModel = require('../models/logModel'),objModel.find(function (err, results) { if (err) { return res.send(500, { error: err }); } results.find().populate(branch.$id).exec(function (err, data) { console.log(data) })});这样对吗? - Hardik Mandankaa
让我们在聊天中继续这个讨论 - Hardik Mandankaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接