我正在尝试查询MongoDB中数组中的单个嵌入式文档。我不知道我在做什么错。我将以编程方式查询此文档,并将新的嵌入式文档插入到当前为空的trips
数组中。
{
"_id" : ObjectId("564b3300953d9d51429163c3"),
"agency_key" : "DDOT",
"routes" : [
{
"route_id" : "6165",
"route_type" : "3",
"trips" : [ ]
},
{
"route_id" : "6170",
"route_type" : "3",
"trips" : [ ]
},
...
]
}
以下查询-我在mongo shell中运行-返回空:
db.tm_routes.find( { routes : {$elemMatch: { route_id:6165 } } } ).pretty();
db.tm_routes.find( { routes : {$elemMatch: { route_id:6165,route_type:3 } } } ).pretty();
db.tm_routes.find({'routes.route_id':6165}).pretty()
也db.tm_routes.find({'routes.route_id':6165}).count()
就是0
。
以下查询返回数组中的每个文档
db.tm_routes.find({'routes.route_id':'6165'}).pretty();
{
"_id" : ObjectId("564b3300953d9d51429163c3"),
"agency_key" : "DDOT",
"routes" : [
{
"route_id" : "6165",
"route_type" : "3",
"trips" : [ ]
},
{
"route_id" : "6170",
"route_type" : "3",
"trips" : [ ]
},
...
]}
但db.tm_routes.find({'routes.route_id':'6165'}).count()
返回1。
最后,这是我首先在Node.JS-中插入数据的方式:
async.waterfall([
...
//RETRIEVE ALL ROUTEIDS FOR EVERY AGENCY
function(agencyKeys, callback) {
var routeIds = [];
var routesArr = [];
var routes = db.collection('routes');
//CALL GETROUTES FUNCTION FOR EVERY AGENCY
async.map(agencyKeys, getRoutes, function(err, results){
if (err) throw err;
else {
callback(null, results);
}
});
//GET ROUTE IDS
function getRoutes(agencyKey, callback){
var cursor = routes.find({agency_key:agencyKey});
cursor.toArray(function(err, docs){
if(err) throw err;
for(i in docs){
routeIds.push(docs[i].route_id);
var routeObj = {
route_id:docs[i].route_id,
route_type:docs[i].route_type,
trips:[]
};
routesArr.push(routeObj);
/* I TRIED 3 DIFFERENT WAYS TO PUSH DATA
//1->
collection.update({agency_key:agencyKey}, {$push:{"routes":{
'route_id':docs[i].route_id,
'route_type':docs[i].route_type,
'trips':[]
}}});
//2->
collection.update({agency_key:agencyKey}, {$push:{"routes":routeObj}});
*/
}
// 3->
collection.update({agency_key:agencyKey}, {$push:{routes:{$each:routesArr}}});
callback(null, routeIds);
});
};
},
...
var collection = newCollection(db, 'tm_routes',[]);
function newCollection(db, name, options){
var collection = db.collection(name);
if (collection){
collection.drop();
}
db.createCollection(name, options);
return db.collection(name);
}
注意:我不使用猫鼬,如果可能的话,我不想使用。
梅利斯
我明白了您的要求,而您需要的是帮助您了解事物在mongodb中的存储方式。要了解的事情:
document
是MongoDB数据的基本单位,可以与row
关系数据库中的进行粗略比较。collection
可以将A视为具有动态模式的表因此documents
存储在collections
。每个文档中都有一个特殊的_id
,即集合内是唯一的。您上面以以下格式向我们显示的是One document
。
{
"_id" : ObjectId("564b3300953d9d51429163c3"),
"agency_key" : "DDOT",
"routes" : [
{
"route_id" : "6165",
"route_type" : "3",
"trips" : [ ]
},
{
"route_id" : "6170",
"route_type" : "3",
"trips" : [ ]
},
...
]}
如果您query
在tm_routes
集合中运行。在find()
将返回各自document
的collection
相匹配的查询。因此,当您运行查询时,db.tm_routes.find({'routes.route_id':'6165'}).pretty();
它将返回与查询匹配的整个文档。因此,此语句是错误的:
以下查询返回数组中的每个文档
如果您需要在该文档中找到一条特定的路由,并且仅根据您的使用返回该路由,因为它是一个数组,因此您可能必须使用$ -Positional运算符或聚合框架。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句