user3003466
user3003466

Reputation: 323

mongodb query in 2 collections

I have define 2 reconds in 2 collections separately in one mongo db like this

order:

{

    "_id" : ObjectId("53142f58c781abdd1d836fcd"),
    "number" : "order1",
    "user" : ObjectId("53159bd7d941aba0621073e3")
}

user

{

    "_id" : ObjectId("53159bd7d941aba0621073e3"),
    "name" : "user1",
    "gender" : "male"

}

when I use this command in console, it can not execute db.orders.find({user: db.user['_id']}) or db.orders.find({user: user['_id']}),

is there anything wrong? Thanks!

Upvotes: 0

Views: 140

Answers (3)

Gh0stik
Gh0stik

Reputation: 145

Maybe you can help this solution:

use orders
db.getCollection('order').find({},{'_id':1})
db.getCollection('user').find({},{'_id':1})

Upvotes: 0

Malcolm Murdoch
Malcolm Murdoch

Reputation: 1085

I think you want:

db.order.find({'user':db.users.findOne({'name':'user1'})._id})

All you need to do is to make a query and check the output before inserting it into the query.

i.e. check that:

db.users.findOne({'name':'user1'})._id

has the output:

ObjectId("53159bd7d941aba0621073e3")

If you want to run larger queries, you're going to have to change your structure. Remember that Mongodb doesn't do joins so you'll need to do create a user document that looks like this:

user
{
 "name":"user1",
 "gender":"male",
 "orders":[
    {
     'number':'order1'
    }
 ]
}

You can then update this using:

 db.user.update({'_id':ObjectId('blah')}, {'orders':{$push:{'number':'order2'}})

This will then start you with order tracking.

Mongo will be able to find using the following:

 db.user.find({'orders.numbers':'order2'})

returning the full user record

Upvotes: 0

Sammaye
Sammaye

Reputation: 43884

Another way is to:

> var user = db.users.findOne({name: 'user1'}); 
> db.orders.find({user: user._id});

This way can be a bit more flexible especially if you want to return orders for multiple users etc.

Taking your comment:

Thanks, but actually, I want to search all the orders of all users, not only one user. So what would I do? Thanks

db.users.find().forEach(function(doc){
    printJson(db.orders.find({user: doc._id}));
});

Upvotes: 1

Related Questions