如何在MongoDB中查询数组中的单个嵌入文档?
How to query a single embedded document in an array in MongoDB?
我正在尝试查询 MongoDB 中数组中的单个嵌入式文档。我不知道我做错了什么。以编程方式,我将查询此文档并将新的嵌入文档插入当前空的 trips
数组中。
{
"_id" : ObjectId("564b3300953d9d51429163c3"),
"agency_key" : "DDOT",
"routes" : [
{
"route_id" : "6165",
"route_type" : "3",
"trips" : [ ]
},
{
"route_id" : "6170",
"route_type" : "3",
"trips" : [ ]
},
...
]
}
以下查询 -I 运行 in mongo shell- return 空:
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
。
以下查询 returns 数组中的每个文档
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()
returns 1.
最后,这是我首先插入数据的方式 -in 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);
}
注意:我没有使用 Mongoose,如果可能也不想使用。
梅丽丝,
我明白你的要求了,你需要的是帮助理解事物是如何存储在 mongodb 中的。要了解的事情:
- 一个
document
是MongoDB的基本数据单位,大致相当于关系数据库中的一个row
。
- 可以将
collection
视为具有动态架构的 table
所以 documents
存储在 collections
中。每个文档都有一个特殊的 _id
,在 collection 中是唯一的。您在上面以以下格式向我们展示的是 One document
.
{
"_id" : ObjectId("564b3300953d9d51429163c3"),
"agency_key" : "DDOT",
"routes" : [
{
"route_id" : "6165",
"route_type" : "3",
"trips" : [ ]
},
{
"route_id" : "6170",
"route_type" : "3",
"trips" : [ ]
},
...
]}
如果你 运行 在你的 tm_routes
collection 中有一个 query
。 find()
将 return collection
中每个 document
匹配该查询。因此,当您 运行 查询 db.tm_routes.find({'routes.route_id':'6165'}).pretty();
时,它是 return 匹配查询的整个文档。因此这个说法是错误的:
The following query returns every document in the array
如果您需要在该文档中查找特定路由,并且仅 return 该路由,具体取决于您的用途,因为它是一个数组,您可能必须使用 $-Positional Operator or the aggregation framework。
对于 Node 和 Mongodb 使用 Mongoose 的用户,这是将查询写入上面的方法之一问题:
db.tm_routes.updateOne(
{
routes: {
$elemMatch: {
route_id: 6165 (or if its in a route path then **6165** could be replaced by **req.params.routeid**
}
}
},
{
$push: {
"routes.$.trips":{
//the content you want to push into the trips array goes here
}
}
}
)
我正在尝试查询 MongoDB 中数组中的单个嵌入式文档。我不知道我做错了什么。以编程方式,我将查询此文档并将新的嵌入文档插入当前空的 trips
数组中。
{
"_id" : ObjectId("564b3300953d9d51429163c3"),
"agency_key" : "DDOT",
"routes" : [
{
"route_id" : "6165",
"route_type" : "3",
"trips" : [ ]
},
{
"route_id" : "6170",
"route_type" : "3",
"trips" : [ ]
},
...
]
}
以下查询 -I 运行 in mongo shell- return 空:
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
。
以下查询 returns 数组中的每个文档
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()
returns 1.
最后,这是我首先插入数据的方式 -in 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);
}
注意:我没有使用 Mongoose,如果可能也不想使用。
梅丽丝,
我明白你的要求了,你需要的是帮助理解事物是如何存储在 mongodb 中的。要了解的事情:
- 一个
document
是MongoDB的基本数据单位,大致相当于关系数据库中的一个row
。 - 可以将
collection
视为具有动态架构的 table
所以 documents
存储在 collections
中。每个文档都有一个特殊的 _id
,在 collection 中是唯一的。您在上面以以下格式向我们展示的是 One document
.
{
"_id" : ObjectId("564b3300953d9d51429163c3"),
"agency_key" : "DDOT",
"routes" : [
{
"route_id" : "6165",
"route_type" : "3",
"trips" : [ ]
},
{
"route_id" : "6170",
"route_type" : "3",
"trips" : [ ]
},
...
]}
如果你 运行 在你的 tm_routes
collection 中有一个 query
。 find()
将 return collection
中每个 document
匹配该查询。因此,当您 运行 查询 db.tm_routes.find({'routes.route_id':'6165'}).pretty();
时,它是 return 匹配查询的整个文档。因此这个说法是错误的:
The following query returns every document in the array
如果您需要在该文档中查找特定路由,并且仅 return 该路由,具体取决于您的用途,因为它是一个数组,您可能必须使用 $-Positional Operator or the aggregation framework。
对于 Node 和 Mongodb 使用 Mongoose 的用户,这是将查询写入上面的方法之一问题:
db.tm_routes.updateOne(
{
routes: {
$elemMatch: {
route_id: 6165 (or if its in a route path then **6165** could be replaced by **req.params.routeid**
}
}
},
{
$push: {
"routes.$.trips":{
//the content you want to push into the trips array goes here
}
}
}
)