Git Product home page Git Product logo

mongodb's Introduction

mongodb's People

Contributors

alcaeus avatar amyboyd avatar avalanche123 avatar beberlei avatar bernardosilva avatar carusogabriel avatar dragoonis avatar edorian avatar erkhembayar-gantulga avatar ftrrtf avatar gnucki avatar henrikbjorn avatar jmikola avatar jwage avatar kriswallsmith avatar majkl578 avatar malarzm avatar munkie avatar nantunes avatar pborreli avatar pgodel avatar prolic avatar quingkhaos avatar rsandrea avatar rybakit avatar scottaubrey avatar sergeyklay avatar sveneisenschmidt avatar tgabi333 avatar userfriendly avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mongodb's Issues

Can't get bytes of a freshly persisted GridFS document

I can't get the bytes of a GridFS document after it is persisted otherwise it throws a fatal error.

The document is persisted correctly it's just that the bytes that can't be read afterwards.

exception 'MongoGridFSException' with message 'couldn't find file size' in mongodb/lib/Doctrine/MongoDB/GridFSFile.php:151

Example:

/** @Document */
class Image {
    public
        /** @Id */
        $id,

        /** @File */
        $image,

        /** @Field */
        $filename
    ;
}
$i = new Image;
$i->image = '/tmp/image';
$i->filename = '123.jpg';
$dm->persist($i);
$dm->flush();

$i->image->getBytes(); //MongoGridFSException

Events from Collection are not that useful.

The Events dispatched from a Collection like postFind and postFindOne are not that useful as you have no access to manipulate or change the data.

Reasoning as to why i would replace the data returned is that i am building a very simple way of having PDO::FECTH_OBJECT feature where the data i hydrated into an object. This is for fun and research but should still be possible.

Saying that i can just use the ODM is not a solution :)

group queries initial value can't be empty

Hi,
I'm writing some group queries using Doctrine mongoDB lately, and I noticed that Doctrine\MongoDB\Query\Builder::group() requires the second argument($initial) to be an array containing at least one key. While this apply to a good bunch of cases, it can happen, sometimes, that I'd like to avoid hardcoding a key in there(mongoDB itself does not force you to do such thing) and add it afterwards in the reduce step. An example could be having many separate counters to keep track of different values of the same field(thinking about tags, I'd like to reduce on something like this: {tag1: 123, tag2: 111, tag3: 333} instead of an hardcoded {count: 456} object. A workaround to the current behavior is to add a bogus key/value so that it doesn't crash the query, but it feels a little wrong to me.
Thanks

submodule issue

Sorry to bother with submodule concern, but lib/vendor/doctrine-common is a submodule, but this repo has no .gitmodules file.

I concur with Kris who thinks, AFAIK, that we should not link vendors through submodules. But let the developer ensure dependencies by himself.

getArrayresult()

Hello,

Why is getArrayResult() not implemented in doctrine:mongodb ?

Thanks

Mongo driver shouldn't be dependency

I use vagrant for development so don't want to be forced to install the mongo driver on my local machine.

Problem 1
    - Installation request for doctrine/mongodb dev-master -> satisfiable by doctrine/mongodb dev-    master.
    - doctrine/mongodb dev-master requires ext-mongo * -> the requested PHP extension mongo is missing from your system.
  Problem 2
    - Installation request for doctrine/mongodb 1.0.x-dev -> satisfiable by doctrine/mongodb 1.0.x-dev.
    - doctrine/mongodb 1.0.x-dev requires ext-mongo * -> the requested PHP extension mongo is missing from your system.
  Problem 3
    - doctrine/mongodb 1.0.x-dev requires ext-mongo * -> the requested PHP extension mongo is missing from your system.
    - iampersistent/mongodb-acl-bundle dev-master requires doctrine/mongodb 1.0.x-dev -> satisfiable by doctrine/mongodb 1.0.x-dev.
    - Installation request for iampersistent/mongodb-acl-bundle dev-master -> satisfiable by iampersistent/mongodb-acl-bundle dev-master

Allow map/reduce to run without querying results from the output collection

Quoting @epicwhale from: doctrine/mongodb-odm#146


I'm trying to perform a mapreduce in which the output is stored to another collection. I've set the configuration for the 'out' option. The mapreduce works fine when I run execute, but what seems to happen is that it also tries to _find / retrieve_ the results from the results collection after executing the map/reduce. This is an unnecessary overhead.

Ideally, it should simply run the mapreduce and do nothing or return the statistics of the mapreduce (time taken, emits, etc). Instead, it queries for all the results of the mapreduce.

<?php 

// $qb is the query builder

$qb->map('function(){
            emit(this.from.userId, {
                sex: this.from.sex,
                circle: this.from.circle,
                age: this.from.age
            });
        }')
        ->reduce('function(k, values){
            return values[values.length - 1];
        }')
        ->out(array('replace' => 'tmp.mr.ActiveUsers_foo'));

$query = $qb->getQuery();

var_dump($query->execute()); // is a LoggableCursor, why?

If I log the commands / queries executed, there's a MapReduce command _followed by a "find" on the collection tmp.mr.ActiveUsers_foo_. The second query shouldn't happen. Is this an intentional behavior? If so, how do I prevent it from happening?


I dug into the code and discovered this. I realized the ->find() function is being called after every mapreduce. What is the thought behind it? Read my comments inline in the code below.

In _Doctrine/MongoDB/Collection.php_ - Line _135_ ( https://github.com/doctrine/mongodb/blob/master/lib/Doctrine/MongoDB/Collection.php#L375 )

<?php
    protected function doMapReduce($map, $reduce, array $out, array $query, array $options)
    {

       // ..........

        if (isset($out['inline']) && $out['inline'] === true) {
            return new ArrayIterator($result['results']);
           // ^^^ this is as expected since results are asked for inline
        }

        return $this->database->selectCollection($result['result'])->find();
        // ^^^ why are we doing this find(..) ? the user has categorically mentioned that he wants the output go to a particular collection. 
    }

Don't you think it would be better to do away with the ->find(..) all together?

Collection insert methods take first argument by reference

I noticed the insert() method (and related do and batch methods) takes its first argument by reference. This goes back two years to the first ODM commit. Is this optimization still necessary? It doesn't jive with the MongoCollection::insert() implementation and prevents use of an array literal.

Collections, References and EventManager

Here's something that I stumbled upon while integrating this lib into PPI and I feel it's necessary to discuss something.

A lot of PHP power users will be doing anonymous arrays like so:

<?php
$collection->insert(array(
    'username' => 'paul'
));

I received the error:
Fatal error: Cannot pass parameter 1 by reference in /Applications/XAMPP/xamppfiles/htdocs/ppi-demo/App/Controller/Demo.php on line 31

I immediately knew what was wrong, because I read most of the source code of this library prior to using it. However for the number of users that are using this library out-right there is a possible pitfall that users may/will fall into and could throw them off.

https://github.com/doctrine/mongodb/blob/master/lib/Doctrine/MongoDB/Collection.php#L494
This function's declaration is:

public function insert(array &$a, array $options = array())

Of course this by-ref $a is so that it can be manipulated via the event listeners and such. However, since we can't check if the user passed an anonymous array or not as it produces a fatal error i'm suggesting the following change.

If you look at the function body, the reference is kept here so that it can go down into the event manager and back out again. What if we just make a local copy and then pass that to the event manager ?

My proposal here, to allow users to avoid this pitfall and pass anonymous arrays into insert() is the following which is a +2 in my opinion.

<?php
    public function insert(array $a, array $options = array())
    {
        $b = $a;
        if ($this->eventManager->hasListeners(Events::preInsert)) {
            $this->eventManager->dispatchEvent(Events::preInsert, new EventArgs($this, $b));
        }

        $result = $this->doInsert($b, $options);

        if ($this->eventManager->hasListeners(Events::postInsert)) {
            $this->eventManager->dispatchEvent(Events::postInsert, new EventArgs($this, $result));
        }
        return $result;
    }

Thoughts?

Thanks for your time.

  • Paul.

Collection.php line 372: Undefined index: results

Hi,

I wanted to try mongodb with doctrine and symfony.

insert/find are working very well but I have a problem since I tried map/reduce.

Here is my code:

        $dm = $this->get('doctrine.odm.mongodb.document_manager');
        $request = $this->getRequest();

        $map = 'function() {
                    emit(1,1);
                }';

        $reduce = 'function(product, values) {
                    return {};
                }';

        $cursor = $dm->createQueryBuilder('Document')
            ->map($map)->reduce($reduce)
            ->getQuery()->execute();

When I run it, I get this error:
Notice: Undefined index: results in doctrine-mongodb/lib/Doctrine/MongoDB/Collection.php line 372

I take a look at the line 372 and print the variable which is affected, it's maybe usefull:

  ["result"]=>
  string(30) "tmp.mr.mapreduce_1315250093_31"
  ["timeMillis"]=>
  int(18)
  ["counts"]=>
  array(3) {
    ["input"]=>
    int(483)
    ["emit"]=>
    int(483)
    ["output"]=>
    int(1)
  }
  ["ok"]=>
  float(1)
}

I have the latest mongodb 1.8.3, the php driver 1.2.4.

Support for $maxDistance

I may be missing this, but there doesn't seem to be support for using $maxDistance with a $near query.

From the Mongo Docs:

db.places.find( { loc : { $near : [50,50] , $maxDistance : 5 } } ).limit(20)

Configuration.php param should be protected instead of private

currently in lib/Doctrine/MongoDB/Configuration.php you have the $attributes param marked as private but it should be protected as when it's extended in mongodb_odm/lib/Doctrine/ODM/MongoDB/Configuration it gives you parse notices since you just access it like $this->attributes[] = ....

_id not set on upsert

The PHP manual explains that passing the array('upsert' => true) option to a call to MongoCollection::update() will add an _id value to the array if the object was inserted. This is not support in this library since the $newObj argument on update() is not a reference.

GridFS doUpdate adds unnecessary $set command when performing $pushAll

I have a collection that stores a document using the @file data type. I also have a field for storing where that file is referenced using the @ReferenceMany(targetDocument="Tag").

The problem is that when it performs the update it will set the collection of references to be like this.

{ "$pushAll" : { "test" : [
{
"$ref" : "employees",
"$id" : ObjectId("4ed823ae05685aae4c00001c")
}
] }

The desired outcome is what would happen inside a collection with no File data type.

"test" : [
{
"$ref" : "employees",
"$id" : ObjectId("4ed823ae05685aae4c00001c")
}
]

I've fixed it by commenting out the part that enforces the set command and its doesn't appear to have had any side effects. I don't know enough about the other functions to make a call on how to fix it correctly however. I notice this could relate to bug #31 also.

MongoCursorException: unauthorized db

Not sure if this is the correct repository to report this (symfony2 repo? mongo-odm repo? mongodb bundle?).

Anyways, using Symfony2 and mongodb with the options as they are meant to be used:

doctrine_mongodb:
default_database: db_name
connections:
default:
server: 10._.98._:27137
options:
username: db_username
password: db_pass

This gives an error:
MongoCursorException: unauthorized db

If I put the full string into the server argument:

doctrine_mongodb:
connections:
default:
server: mongodb://db_username:db_pass@10._.98._:27137/db_name

It works with the above settings. Not sure what exactly is causing the problem.

Large Memory Leak

Hi,

I'm using the following piece of code to process a large amount of data. The function is designed to insert or update (upsert) data, however when looping through thousands of records of data, I'm gaining 7MB of memory every few seconds, non-stop!

public function iouProgramme($data, DateTime $dateTime, DocumentManager $documentManager) {
    /* @var $qb \Doctrine\MongoDB\Query\Builder */
    $qb = $documentManager->getRepository('StrawberrypearTvBundle:Programme')->createQueryBuilder();
    $qb->update()->upsert()
            ->field('channel')->equals($data['channel']->getId())
            ->field('start_time')->equals($dateTime->modify($data['start_time']->format('c')));

    if (isset($data['end_time']))       $qb->field('end_time')->set($data['end_time']);
    if (isset($data['duration']))       $qb->field('duration')->set($data['duration']);
    if (isset($data['title']))          $qb->field('title')->set($data['title']);
    if (isset($data['sub_title']))      $qb->field('sub_title')->set($data['sub_title']);
    if (isset($data['description']))    $qb->field('description')->set($data['description']);
    if (isset($data['category']))       $qb->field('category')->set($data['category']);
    if (isset($data['episode']))        $qb->field('episode')->set($data['episode']->toArray());
    if (isset($data['quality']))        $qb->field('quality')->set($data['quality']);
    if (isset($data['subtitles']))      $qb->field('subtitles')->set($data['subtitles']);

    /* @var $query \Doctrine\MongoDB\Query\Query */
    $query = $qb->getQuery();
    $query->execute();

    unset($query, $qb, $data);

    return true;
}

I can stop the memory leak by simply commenting out the $query->execute(); line, but obviously this kills the point of everything. Also worth mentioning that I've commented out every part of the query until I'm not actually finding or updating anything, and there is still a memory leak.

I believe the leak must be somewhere within the Doctrine/MongoDB code.

Can someone please help me shed some light on this?

Thanks,

Rob

Make possible array argument for Query\Builder->select()

Currently Query\Builder->select() use multiple arguments (with func_get_args()).
It is not possible to give fields as an array and I think it's useful.

We should check if $fieldName is an array, and use elements of this array as field names.
If $fieldName is not an array, we use the current code (with func_get_args()).

The exclude() method should be also changed.

missing functionality : excluding fields in a find query

In mongoDb you can choose fields not to select, wich seems impossible with the current Doctrine\MongoDB\Query\Builder::select() implementation.
It becomes a pain if you want to exclude just one or two fields in a object having really a lot of properties.
There could be a simple solution that doesn't seem to break backwards compatibility :

 public function select($fieldName = null)
 {
        $select = func_get_args();
        foreach ($select as $fieldName) {
             $this->query['select'][$fieldName] = 1; //instead of $this->query['select'][] = $fieldName
        }
        return $this;
 }

 public function exclude($fieldName = null)
 {
        $select = func_get_args();
        foreach ($select as $fieldName) {
             $this->query['select'][$fieldName] = false;
        }
        return $this;
 }

Can't set ID in GridFS document

I can't assign an ID to a GridFS document before it is persisted otherwise it throws a fatal error.

Catchable fatal error: Argument 2 passed to Doctrine\MongoDB\GridFS::storeFile() must be of the type array, null given, called in mongodb/lib/Doctrine/MongoDB/GridFS.php on line 84 and defined in mongodb/lib/Doctrine/MongoDB/GridFS.php on line 145

Example:

/** @Document */
class Image {
    public
        /** @Id(strategy="none") */
        $id,

        /** @File */
        $image,

        /** @Field */
        $filename
    ;
}
$i = new Image;
$i->id = '123';
$i->image = '/tmp/image';
$i->filename = '123.jpg';
$dm->persist($i);
$dm->flush();

near() query is not working

When I try this query:

$qb = $this->createQueryBuilder();
$qb->field('coordinates')->near(array($latitude, $longitude));
return $qb->getQuery()->execute();

It doesn't even query de database so it doesn't return any result.

Use of tags

Why tags aren't used here? I wish you can use them as pulling from master branch directly isn't reliable specially if I'm using this code in production.

I just pulled from master and got an unexpected error caused by a fresh commit.

Keep up the great work.

finalize() method is missing in QueryBuilder

It seems that Query Builder does not have a finalize() method implemented and therefore I am not sure how to make use of this feature from Doctrine either in MapReduce or Group aggregation.
Thanks

MongoDB\Collection

line 630:
public function setSlaveOkay($ok = true)
{
return $this->getMongoCollection()->setSlaveOkay($ok);
}

One version 1.2.11 this results in the emission of E_DEPRECATED

Version Description
1.2.11 Emits E_DEPRECATED when used.

Doctrine ODM Zend 2 Module - MongoHQ - Failed to connect to: mongodb - unauthorized db:doctrine lock type:

Hi All. I am struggling to get a connection to my mongo db to work. I have and account with mongohq. I am using Zend 2 and the mongo odm module available on github. I have tried:

 'connection' => array(
            'odm_default' => array(
                'server'    => 'flame.mongohq.com',
                'port'      => '<port>',
                'user'      => '<user>',
                'password'  => '<password>',
                'dbname'    => '<database>',
            ),
        ),

The result for that is:

flame.mongohq.com:27058: unauthorized db:doctrine lock type:-1 client:[CLIENT IP

So I tried:

'server' => 'mongodb://flame.mongohq.com/27058'

and the result for that is

Failed to connect to: mongodb:0: No such file or directory

I also tried defining the entire string and passing it to the server variable , i.e.

$mongoDns = sprintf('mongodb://%s:%s@%s:%s/%s',
  '<user>',
  '<password>',
  'flame.mongohq.com',
  '27058',
  '<database>'
);

I get the same "failed to connect" result.

I also tried to pass the string above to the MongoClient function and then pass that object to the server variable. result

Failed to connect to: flame.mongohq.com:27058:27058: Couldn't get host info for flame.mongohq.com:27058

So, it looks to me like there is a bug somewhere. But I cant figure out where.

I tried the connection string and MongoClient function independently (not using the Zend 2 Module or Doctrine) and it connected fine.

Any thoughts? Is there anyone that has successfully connected to a host requiring authentication using the Mongo-ODM Zend 2 module?

Fix PHPDoc @return types in various places

In certain PHPDoc blocks for functions, the @return type is not of the right type. This causes auto-completion issues in various IDEs (I'm using PhpStorm).

For example in \Doctrine\MongoDB\Query\Builder

the return types for functions like field(..), equals(..), where(..) is @return Query instead of being @return Builder.

Similarly, there are such issues in other parts of the code.

I'm going to try my best to fix these issues in my fork and submit a pull request over the coming weeks while I use this library, but it would be good to have this fixed.

GridFS::doUpdate throws error when non-dirty file metadata is updated

If a non-dirty GridFS file has some metadata fields updated with an $unset command, GridFS:doUpdate throws "Invalid modifier specified: $set"

Below is merely an example of what's happening, not code I'm actually using:

$query = array('_id' => new \MongoID('4e2b16689fd265b601000001'));

$file = new \Doctrine\MongoDB\GridFSFile();
$file->isDirty(false);

$newObj = array('$set' => array('file' => $file), '$unset' => array('specialmetafield' => true));

\Doctrine\MongoDb\GridFs::doUpdate($query, $newObj);

Throws a MongoCursorException with message "Invalid modifier specified: $set" (in \Doctrine\MongoDB\GridFS line 84), and it looks like it's passing an empty $set modifier to MongoCollection::update().

This query is from the Doctrine ODM w/Symfony2, it's how it updates GridFS files if a particular field has been emptied but the actual file has not been updated.

The fix is simple, just make sure that if $newObj has a key of '$set' and it's an empty array, it should be unset.

Cannot perform upsert(true) in QueryBuilder without explicitly setting the option in getQuery(..)

Problem

While doing an ->update() using the QueryBuilder, if I set the upsert to true using ->upsert(true), it does not work. I've to additionally also do a ->getQuery(array('upsert' => true)) before I ->execute(). This behavior is unexpected and undocumented. It defeats the purpose of having the ->upsert(true) function.

Example Code

$qb
   ->update()
   ->upsert(true)
   ->field('a')->equals('5783b417a6da7e6d77426428ab48e5f7')
   ->field('b')->equals('foo)
   ->field('count')->set(5)
   ->getQuery(array('upsert' => true))  // <-- upsert does not happen if not set
   ->execute();

History

This bug has also been previously reported at the following locations:

Solution

This problem is happening merely because the value stored in $this->query['upsert'] is not passed on to the $this->options['upsert'] in the execute() function at https://github.com/doctrine/mongodb/blob/master/lib/Doctrine/MongoDB/Query/Query.php#L174

The solution is adding the following lines above it.

if ($this->query['upsert']) {
    $this->options['upsert'] = $this->query['upsert'];
}

QB Near - Bad Docblock

It appears that this function is documented inconsistently. It looks like the code expects an array.

 /**
     * Add where near criteria.
     *
     * @param string $x
     * @param string $y
     * @return Builder
     */
    public function near($value)
    {
        $this->query['type'] = Query::TYPE_GEO_LOCATION;
        $this->query['near'][$this->currentField] = $value;
        return $this;
    }

It looks like there are larger issues than that. Since the code is using geoNear command to run the query, the field is irrelevant and it appears to break. Mongo will use the only geoindex on the collection.

This line:

$this->query['near'][$this->currentField] = $value;

Should probably be changed to:

$this->query['near'] = $value;

make Builder::elemMatch acting on select, not only on query

hi there, and thanks for the great job you re doing here.
my concern is about use of Builder :: elemMatch in the select part of the query builder,
the available elemMatch method of query builder is now usable only as part of query part not the projection one.

would it be possible to add something like selectSlice to do so :

public function selectElemMatch($fieldName, $elemMatch)
{

    $this->query['select'][$fieldName] = array($this->cmd . 'elemMatch' => $elemMatch);
    return $this;
}

or simply modify the select method to with a second argument (defaults to 1), to hold the elemMatch filter condition.

Regards

Query on embedded document

Hello.

Hello!

I'm newbie with doctrine and mongo. I have created a collection like follow

{ "_id" : ObjectId("500533e260e621891d000003"), "idClient" : "01", "nome" : "Gisella", "posts" : [ { "_id" : ObjectId("500533e260e621891d000004"), "idPost" : "01", "text" : "info1"}}

and I want filter my collection for idClient and idPost.

With this query builder I can't fetch any rows

        $data = $dm->createQueryBuilder()
        ->field("idClient")->equals("01")
        ->field("posts.idPost")->equals("01")
        ->getQuery()
        ->getSingleResult();

Could you tell me the right way to do that?

Thanks in advance

Gisella

Wrong group query?

I found that Doctrine\MongoDB\Query\Builder::group method uses "keys" instead of "key" so it's not possible to execute below query:

// Group by user-agent, returning a sum for each user-agent.

db.pageviews.group({
  key: {'user.agent': true}, 
  initial: {count: 0}, 
  reduce: function(doc, prev) { prev.count++ }
});

// Should returns

[{
  'user.agent': 'Mozilla 5.0 / Gecko'
  'count': 241
},{
  'user.agent': 'Mozilla 5.0 / Webkit' 
  'count': 79
}]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.