2个文档在MongoDB中合并

时间:2012-06-15 18:57:32

标签: mongodb

我需要从MongoDB中的不同集合中的两个文档(其中包含1个公共字段,不更改数据库)中获取数据。我是新手,请帮助我

a = db.users.find(username:'abc@xyz.com')
b = db.tasks.find(username:'abc@xyz.com')

如何获得a和b合并的变量c?

请帮忙。这可能是微不足道的,但对我有帮助。

5 个答案:

答案 0 :(得分:2)

您可以使用BSON Api中的merge() method。它会给你b结合a并将结果存储在b中。在执行此操作之前,您可能希望在c中复制b。

答案 1 :(得分:2)

如果用户在两个集合中都是唯一的,请使用函数findOne(),因为find()返回一个游标。因此,要在mongoDB控制台中实现两个对象的合并,可以使用以下代码:

function mergeObjects(a,b) {
    res = new Object();

    for (attr in a) 
          res[attr] = a[attr];
    for (attr in b)
          res[attr] = b[attr];

    // only if you wanna save it in a document again
    delete res["_id"];
    return res;
 }

a = db.users.findOne({"username" : 'abc@xyz.com'})
b = db.tasks.findOne({"username" : 'abc@xyz.com'})
c = mergeObjects(a,b)

希望这可以解决您的问题。

答案 2 :(得分:0)

对于数据聚合,您最好不要熟悉MongoDB的map / reduce功能。 您可以阅读更多相关信息here

一旦弄明白,编写Map(检索数据)和Reduce(聚合数据)函数就不难了。

答案 3 :(得分:0)

您必须在应用程序中执行此操作。不要担心必须运行两个查询,因为它不一定比运行一个复杂的查询慢。

答案 4 :(得分:0)

我知道这可能不是你的情况,但是如果你使用clojure,一个优雅的解决方案是在从mongo检索文档后使用listViewLeaderBoard = (ListView) findViewById(R.id.listView_leader_board); reference = FirebaseDatabase.getInstance().getReference("score"); leaderBoards = new ArrayList<>(); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot postSnapshot : dataSnapshot.getChildren()){ LeaderBoard leaderBoard = postSnapshot.getValue(LeaderBoard.class); leaderBoards.add(0,leaderBoard); } } @Override public void onCancelled(DatabaseError databaseError) { } }); //Collections.sort(leaderBoards); CustomLeaderBoardAdapter adapter = new CustomLeaderBoardAdapter(getApplicationContext(),R.layout.leader_board_list_layout,leaderBoards); listViewLeaderBoard.setAdapter(adapter); adapter.notifyDataSetChanged(); 函数。

merge-with